`
leiwuluan
  • 浏览: 695153 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

android ExpandableListView可扩展列表

 
阅读更多

先看一效果图、

列表中要有 图片和文字:


 

 

 

 

所以我们要实现一个自定义的   适配器。

 

介绍一个类:BaseExpandableListAdapter   

一看就知道是 适配器的一个基类了。

 

 

所以我们自定义的适配器要 继承它。

 

除了 完成这个 适配器,还要有两个自定义模板,分别   组和子列表的,单元模板。如下图:


 

 

 

模板布局xml  要放在 layouts  下面。

 

main_tree_group.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_tree_title_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:background="@color/white"
        android:text="NoData"
        android:textColor="@color/black"
        android:textSize="20dp"
        android:textStyle="bold" />

</LinearLayout>

 

 

子列表模板文件

main_tree_child.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:paddingLeft="8dp"
    android:paddingTop="8dp" >

    <ImageView
        android:id="@+id/mainChildIcoId"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/person_icon" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/mainChildText1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:text="CNoData"
            android:textColor="@color/black"
            android:textSize="16dp" />

        <TextView
            android:id="@+id/mainChildText2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:text="13693668970"
            android:textColor="@color/black"
            android:textSize="12dp" />
    </LinearLayout>

</LinearLayout>

 

 

 

 

然后写两个对  模板文件的    bean

 

main_tree_group.xml 对应 bean

	//父单元
	class ExpandableGroupHolder {
		TextView title;
	} 
 

main_tree_child.xml

 

	//单元类
	class ExpandableListHolder {
		TextView nickName;
		TextView phone;
		ImageView ioc;
	} 
 

 

现在来实现最重要的关结。  适配器  

MainListExpandableListAdapter.java

 

我这里把 上面两个模板对应java bean 写成 自定义适配器的内部类。

 

 

 

 

 

 

 

package com.main.apadter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.main.R;

public class MainListExpandableListAdapter extends BaseExpandableListAdapter {
	
	//单元类
	class ExpandableListHolder {
		TextView nickName;
		TextView phone;
		ImageView ioc;
	} 
	
	//父单元
	class ExpandableGroupHolder {
		TextView title;
	} 
	
	private List<Map<String, Object>> groupData;//组显示
	private List<List<Map<String, Object>>> childData;//子列表
	
	private LayoutInflater mGroupInflater; //用于加载group的布局xml
	private LayoutInflater mChildInflater; //用于加载listitem的布局xml
	
	//自宝义构造
	public MainListExpandableListAdapter(Context context, List<Map<String, Object>> groupData, List<List<Map<String, Object>>> childData) {
		this.childData=childData;
		this.groupData=groupData;
		
		mChildInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		mGroupInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	//必须实现 得到子数据
	@Override
	public Object getChild(int groupPosition, int j) {
		return childData.get(groupPosition).get(j);
	}

	@Override
	public long getChildId(int groupPosition, int j) {
		return groupPosition;
	}

	@Override
	public int getChildrenCount(int i) {
		return childData.get(i).size();
	}

	@Override
	public Object getGroup(int i) {
		return groupData.get(i);
	}

	@Override
	public int getGroupCount() {
		return groupData.size();
	}

	@Override
	public long getGroupId(int i) {
		return i;
	}

	@Override
	public boolean hasStableIds() {//行是否具有唯一id
		return false;
	}

	@Override
	public boolean isChildSelectable(int i, int j) {//行是否可选
		return false;
	}
	
	@Override
	public View getGroupView(int groupPosition, boolean flag, View convertView, ViewGroup viewgroup) {
		ExpandableGroupHolder holder = null; //清空临时变量holder
		if (convertView == null) { //判断view(即view是否已构建好)是否为空

			convertView = mGroupInflater.inflate(R.layout.main_tree_group, null);
			holder = new ExpandableGroupHolder();
			holder.title=(TextView) convertView.findViewById(R.id.main_tree_title_id);
			convertView.setTag(holder);
		} else { //若view不为空,直接从view的tag属性中获得各子视图的引用
			holder = (ExpandableGroupHolder) convertView.getTag();
		}
		String title=(String)this.groupData.get(groupPosition).get("title");
		holder.title.setText(title);
		notifyDataSetChanged();
		return convertView;
	}
	
	@Override
	public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
			ViewGroup viewgroup) {
		ExpandableListHolder holder = null;
		if (convertView == null) {
			convertView = mChildInflater.inflate(R.layout.main_tree_child, null);

			holder = new ExpandableListHolder();
			holder.nickName = (TextView) convertView.findViewById(R.id.mainChildText1);
			holder.ioc = (ImageView) convertView.findViewById(R.id.mainChildIcoId);
			holder.phone = (TextView) convertView.findViewById(R.id.mainChildText2);
			convertView.setTag(holder);
		} else {//若行已初始化,直接从tag属性获得子视图的引用
			holder = (ExpandableListHolder) convertView.getTag();
		} 
		Map<String,Object> unitData=this.childData.get(groupPosition).get(childPosition);
		holder.nickName.setText((String)unitData.get("nickName"));
		holder.ioc.setImageResource((Integer) unitData.get("ico"));
		holder.phone.setText((String)unitData.get("phone"));
		return convertView;
	}
}
 

 

 

 

接下来要做的就是  利用自定义的适配器。  添加盟数据进行显了。

 

1、建一个 xml  设样式并设id   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@color/white"
    android:orientation="vertical" >

<ExpandableListView
            android:id="@+id/expandable_id"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@color/white"
            android:drawSelectorOnTop="false"
            android:listSelector="@color/white" />

</LinearLayout>
 

 

 

创建activity

public class MainActivity extends Activity {
	// 声明对象
	private MainListExpandableListAdapter adapter = null;
	List<Map<String, Object>> groups;
	List<List<Map<String, Object>>> childs;
	ExpandableListView expandableListView;

	private FriendsDao friendsDao;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		friendsDao=new FriendsDao(this,"ll1x.db",null,2);
		
		//为ExpandableListView准备数据
		groups = new ArrayList<Map<String, Object>>();
		Map<String, Object> group = new HashMap<String, Object>();
		group.put("title", "我的家人");
		groups.add(group);

		List<Map<String, Object>> child1 = new ArrayList<Map<String, Object>>();
		Cursor cursor = friendsDao.selectAll();
		while(cursor.moveToNext()){
			Map<String, Object> child1Data1 = new HashMap<String, Object>();
			child1Data1.put("nickName", cursor.getString(cursor.getColumnIndex("nickName")));
			child1Data1.put("phone", cursor.getString(cursor.getColumnIndex("phone")));
			child1Data1.put("ico", R.drawable.icon);
			child1.add(child1Data1);
		}

		childs = new ArrayList<List<Map<String, Object>>>();
		childs.add(child1);

		// 实例化ExpandableListView对象
		expandableListView = (ExpandableListView) findViewById(R.id.expandable_id);
		// 实例化ExpandableListView的适配器
		adapter = new MainListExpandableListAdapter(getApplicationContext(), groups, childs);

		// 设置适配器
		expandableListView.setAdapter(adapter);

		// 设置监听器
		expandableListView.setOnChildClickListener(new OnChildClickListener() {

			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				Log.d("test", "GroupPosition is " + groupPosition);
				Log.d("test", "ChildPosition is" + childPosition);
				return false;
			}
		});
	}
}
 

 

ok 可了。可以放到项目当去了。

 

 

 

 

 

 

  • 大小: 66.3 KB
  • 大小: 96.3 KB
  • 大小: 7.1 KB
  • 大小: 14.5 KB
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics