BaseExpandableListAdapter的详细说明

BaseExpandableListAdapter主要是作为ExpandableListView的Adapter,而ExpandableListView顾名思义就是可展开的ListView,实际中有很多使用到ExpandableListView的例子,例如QQ好友列表等,使用ExpandableListView最主要就是要实现BaseExpandableListAdapter了。

参考了网上别人的代码,根据自己的理解,较为详细的解说一下BaseExpandableListAdapter的使用:


1.使用ExpandableListView的布局文件比较简单:

<ExpandableListView 
        android:id="@+id/expandableListView"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_weight="1"/>


2. 定义ExpandableListAdapter的子类:MyExpandableListAdapter

public class MyExpandableListViewAdapter extends BaseExpandableListAdapter{

......

}


3.类中的属性:

BaseExpandableListAdapter里面添加一些属性:

Context context;                    //Context为ExpandableListView所在的Activity,通过构造方法的参数传递进来,可以获得该Activity对应的Inflater
LayoutInflater mInflater;     //获得Activity的Inflater
String []mGroupStrings;       //父列表项显示的文字(字符串)
List<List<Item>> mData;      //子列表项,Item为自定义类,用来表示展开的子列表项的内容:图片+文字等
 

4.显示子列表项内容的类Item,假设我们的子列表项就仿造QQ,包括一个头像,QQ昵称,QQ签名

先给出Item的类定义:表示我们的子列表项的内容

public class Item {
    private int resId;            //图片(头像)的Id
    private String name;    //子列表项的名字(QQ昵称)
    private String detail;    //子列表项的详细信息(QQ签名)
};


5.构造方法:通过构造方法的参数传递对我们定义的属性进行赋值

public MyExpandableListViewAdapter(Context context,List<List<Item>>list){
        mContext=context;
        mData=list;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mGroupStrings = mContext.getResources().getStringArray(R.array.group);            //R.array.group存放每一个父列表项的名字
}

6.ExpandableListAdapter其中里面需要重载方法如下:

//获取子列表项对应的Item
@Override
public Item getChild(int groupPosition, int childPosition) {
	return mData.get(groupPosition).get(childPosition);
}
 
//获得子列表项的Id
@Override
public long getChildId(int groupPosition, int childPosition) {
	return childPosition;
}


//获得子列表项,比较重要、难理解的 一个方法
@Override
public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
        
        //convertView is the old view to reuse,使用前需要对convertView判断是否为空
	if (convertView == null) { 
                 //如果第一次调用则convertView为null,需要获得对应的layout布局文件:子列表项的布局R.layout.child_item_layout
                 convertView = mInflater.inflate(R.layout.child_item_layout, null); 
        } 
        //子列表项的布局文件的View类,具体看下面的类定义
        ChildViewHolder holder = new ChildViewHolder(); 
        holder.mIcon = (ImageView) convertView.findViewById(R.id.img); 
        holder.mIcon.setBackgroundResource(getChild(groupPosition,childPosition).getImageId()); 
        holder.mChildName = (TextView) convertView.findViewById(R.id.item_name); 
        holder.mChildName.setText(getChild(groupPosition, childPosition).getName()); 
        holder.mDetail = (TextView) convertView.findViewById(R.id.item_detail); 
        holder.mDetail.setText(getChild(groupPosition, childPosition).getDetail()); 
        return convertView; 
}
上面的ChildViewHolder类定义如下:
private class ChildViewHolder { 
        ImageView mIcon; 
        TextView mChildName; 
        TextView mDetail; 
} 
该类是为了表示子列表项涉及到的View,有:一个显示图片的ImageView,一个显示名字的TextView,一个显示具体信息的TextView;与类Item不同,Item类表示的是子列表项中的View的具体内容


//获得子列表项的数目
@Override
public int getChildrenCount(int groupPosition) {
	return mData.get(groupPosition).size();
}

//获得父列表项
@Override
public List<Item> getGroup(int groupPosition) {
	return mData.get(groupPosition);
}

//获得父列表项的数目
@Override
public int getGroupCount() {
	return mData.size();
}

//获得父列表项的Id
@Override
public long getGroupId(int groupPosition) {
	return groupPosition;
}

//获得父列表项,与getChildView方法类似
@Override
public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {
	if (convertView == null) { 
	        convertView = mInflater.inflate(R.layout.group_item_layout, null); 
	} 
	GroupViewHolder holder = new GroupViewHolder(); 
	holder.mGroupName = (TextView) convertView.findViewById(R.id.group_name); 
	holder.mGroupName.setText(mGroupStrings[groupPosition]); 
	holder.mGroupCount = (TextView) convertView.findViewById(R.id.group_count); 
	holder.mGroupCount.setText("[" + mData.get(groupPosition).size() + "]"); 
	return convertView; 
}
其中的GroupViewHolder类定义:父列表项涉及到的View:一个显示父列表项名字的TextView,一个显示子列表项数目的TextView

private class GroupViewHolder { 
        TextView mGroupName; 
        TextView mGroupCount; 
} 

@Override
public boolean hasStableIds() {
	return false;
}

//子列表项是否能否触发事件,返回true则为可以响应点击
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
	return true;
}

7. 以下是整一个类的代码

package com.example.friendslist;

import java.util.List;

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.example.qq.R;

public class MyExpandableListViewAdapter extends BaseExpandableListAdapter{

	private Context mContext; 
    private LayoutInflater mInflater = null; 
    private String[]   mGroupStrings = null; 
    private List<List<Item>>   mData = null; 
    
    private class GroupViewHolder { 
        TextView mGroupName; 
        TextView mGroupCount; 
        
    } 
 
    private class ChildViewHolder { 
        ImageView mIcon; 
        TextView mChildName; 
        TextView mDetail; 
    } 
	
    public MyExpandableListViewAdapter(Context context,List<List<Item>>list){
    	mContext=context;
    	mData=list;
    	mInflater = (LayoutInflater) mContext 
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        mGroupStrings = mContext.getResources().getStringArray(R.array.group); 
    }
    
	@Override
	public Item getChild(int groupPosition, int childPosition) {
		return mData.get(groupPosition).get(childPosition);
	}

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

	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		if (convertView == null) { 
            convertView = mInflater.inflate(R.layout.child_item_layout, null); 
        } 
        ChildViewHolder holder = new ChildViewHolder(); 
        holder.mIcon = (ImageView) convertView.findViewById(R.id.img); 
        holder.mIcon.setBackgroundResource(getChild(groupPosition, 
                childPosition).getImageId()); 
        holder.mChildName = (TextView) convertView.findViewById(R.id.item_name); 
        holder.mChildName.setText(getChild(groupPosition, childPosition) 
                .getName()); 
        holder.mDetail = (TextView) convertView.findViewById(R.id.item_detail); 
        holder.mDetail.setText(getChild(groupPosition, childPosition) 
                .getDetail()); 
        return convertView; 
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		return mData.get(groupPosition).size();
	}

	@Override
	public List<Item> getGroup(int groupPosition) {
		return mData.get(groupPosition);
	}

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

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

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {    //convertView is the old view to reuse
		 if (convertView == null) { 
	            convertView = mInflater.inflate(R.layout.group_item_layout, null); 
	        } 
	        GroupViewHolder holder = new GroupViewHolder(); 
	        holder.mGroupName = (TextView) convertView 
	                .findViewById(R.id.group_name); 
	        holder.mGroupName.setText(mGroupStrings[groupPosition]); 
	        holder.mGroupCount = (TextView) convertView 
	                .findViewById(R.id.group_count); 
	        holder.mGroupCount.setText("[" + mData.get(groupPosition).size() + "]"); 
	        return convertView; 
	}

	@Override
	public boolean hasStableIds() {
		return false;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return true;
	}

}

以上就是关于BaseExpandableListAdapter的用法介绍~













  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值