先看一效果图、
列表中要有 图片和文字:
所以我们要实现一个自定义的 适配器。
介绍一个类: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 可了。可以放到项目当去了。