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的用法介绍~