可折叠列表最常见的例子就是qq联系人列表。其实他跟listView的区别也不大,就是item换成了组和子列表,一个组对应一个子列表。
直接贴代码
item_group
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/group_text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="这是组"
android:textSize="24sp"/>
</LinearLayout>
item_child
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#1fede0">
<ImageView
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"
/>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="这是子列表item"
android:textSize="20sp"/>
</LinearLayout>
对应的数据类
public class GData {
public String gtext;
public GData(String gtext){
this.gtext=gtext;
}
}
public class IData {
public int imgid;
public String text;
public IData(int imgid,String text){
this.imgid=imgid;
this.text=text;
}
}
重写的Adapter类
public class MAdapter extends BaseExpandableListAdapter{
private ArrayList<GData> gDatas;
private ArrayList<ArrayList<IData>> items;
private Context context;
public MAdapter(ArrayList<GData> gDatas, ArrayList<ArrayList<IData>> items,
Context context){
this.context=context;
this.gDatas = gDatas;
this.items=items;
}
@Override
public int getGroupCount() {
return gDatas.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return items.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return gDatas.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return items.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
//组和子元素是否持有稳定的ID。一般为false
@Override
public boolean hasStableIds() {
return false;
}
//显示分组视图
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ViewHolderGroup viewHolderGroup;
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.item_group,parent,false);
viewHolderGroup=new ViewHolderGroup();
viewHolderGroup.group_text= (TextView) convertView.findViewById(R.id.group_text);
convertView.setTag(viewHolderGroup);
}
else{
viewHolderGroup= (ViewHolderGroup) convertView.getTag();
}
viewHolderGroup.group_text.setText(gDatas.get(groupPosition).gtext);
return convertView;
}
//显示子列表item视图
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
ViewHolderItem viewHolderItem;
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.item_child,parent,false);
viewHolderItem=new ViewHolderItem();
viewHolderItem.img= (ImageView) convertView.findViewById(R.id.img);
viewHolderItem.text= (TextView) convertView.findViewById(R.id.text);
convertView.setTag(viewHolderItem);
}
else {
viewHolderItem= (ViewHolderItem) convertView.getTag();
}
viewHolderItem.img.setImageResource(items.get(groupPosition).get(childPosition).imgid);
viewHolderItem.text.setText(items.get(groupPosition).get(childPosition).text);
return convertView;
}
//设置子列表是否可选中
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private static class ViewHolderGroup{
private TextView group_text;
}
private static class ViewHolderItem{
private ImageView img;
private TextView text;
}
}
主活动类
public class MainActivity extends AppCompatActivity{
public ArrayList<GData> gDatas;
public ArrayList<ArrayList<IData>> items;
public ArrayList<IData> iDatas;
public Context context;
public ExpandableListView elist;
public MAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=MainActivity.this;
elist= (ExpandableListView) findViewById(R.id.expand);
initdata();
mAdapter=new MAdapter(gDatas,items,context);
elist.setAdapter(mAdapter);
elist.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
int childPosition, long id) {
Toast.makeText(context,items.get(groupPosition).get(childPosition).text,
Toast.LENGTH_SHORT).show();
return false;
}
});
elist.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
Toast.makeText(context,gDatas.get(groupPosition).gtext,
Toast.LENGTH_SHORT).show();
return false;
}
});
}
public void initdata(){
gDatas=new ArrayList<GData>();
items=new ArrayList<ArrayList<IData>>();
gDatas.add(new GData("A组"));
gDatas.add(new GData("B组"));
gDatas.add(new GData("C组"));
iDatas=new ArrayList<IData>();
iDatas.add(new IData(R.mipmap.ic_launcher,"A组1号"));
iDatas.add(new IData(R.mipmap.ic_launcher,"A组2号"));
items.add(iDatas);
iDatas=new ArrayList<IData>();
iDatas.add(new IData(R.mipmap.ic_launcher,"B组1号"));
iDatas.add(new IData(R.mipmap.ic_launcher,"B组2号"));
items.add(iDatas);
iDatas=new ArrayList<IData>();
iDatas.add(new IData(R.mipmap.ic_launcher,"C组1号"));
iDatas.add(new IData(R.mipmap.ic_launcher,"C组2号"));
items.add(iDatas);
}
}
可以看到,跟listView的用法很相似。但是有点问题,组的点击事件和子列表的点击事件都返回了一个boolean类型的值,子列表那里返回false,true都可以,组那里返回true的话子列表就不会展开了。查了API都是说 True if the click was handled 感觉也没说明白。有哪位读者若是知道麻烦留言告知一下。