ExpandableListView是一个可折叠的ListView。
效果如下:
思路:
1、创建数据适配器,继承与BaseExpandableListAdapter。(实现相应的重写方法)
2、创建组类(Group),子项类(Item)。
3、在自定义的MyBaseExpandableListAdapter中创建ViewHolderGroup类,ViewHolderItem类。
4、实现其中的getGroupView( )和getChildView( )方法。(参考之前博文的ListViewAdapter通用模板)
5、设置子列表是否可选中(很重要!!!),否则点击子项会出错。
//设置子列表是否可选中(很重要!!!),否则点击子项会出错 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; }
6、在MainActivity中调用即可。
代码如下:
MyBaseExpandableListAdapter.java的代码如下:
package com.deepreality.expandablelistviewdemo; 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 java.util.ArrayList; public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter { private ArrayList<Group> gData; private ArrayList<ArrayList<Item>> iData; private Context mContext; public MyBaseExpandableListAdapter(ArrayList<Group> gData,ArrayList<ArrayList<Item>> iData, Context mContext) { this.gData = gData; this.iData = iData; this.mContext = mContext; } @Override public int getGroupCount() { return gData.size(); } @Override public int getChildrenCount(int groupPosition) { return iData.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return gData.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return iData.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolderGroup viewHolderGroup = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_group, parent, false); viewHolderGroup = new ViewHolderGroup(convertView); convertView.setTag(viewHolderGroup); } else { viewHolderGroup = (ViewHolderGroup) convertView.getTag(); } viewHolderGroup.tv_group_name.setText(gData.get(groupPosition).getGroupName()); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolderItem viewHolderItem = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_item, parent, false); viewHolderItem = new ViewHolderItem(convertView); convertView.setTag(viewHolderItem); } else { viewHolderItem = (ViewHolderItem) convertView.getTag(); } viewHolderItem.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getItemImage()); viewHolderItem.tv_name.setText(iData.get(groupPosition).get(childPosition).getItemName()); return convertView; } //设置子列表是否可选中(很重要!!!),否则点击子项会出错 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private static class ViewHolderGroup{ private TextView tv_group_name; public ViewHolderGroup(View convertView) { tv_group_name = convertView.findViewById(R.id.tv_group_name); } } private static class ViewHolderItem{ private ImageView img_icon; private TextView tv_name; public ViewHolderItem(View convertView) { img_icon = convertView.findViewById(R.id.img_icon); tv_name = convertView.findViewById(R.id.tv_name); } } }
MainActivity.java的代码如下:
package com.deepreality.expandablelistviewdemo; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ExpandableListView; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private ArrayList<Group> gData = null; private ArrayList<ArrayList<Item>> iData = null; private ArrayList<Item> lData = null; private Context mContext; private ExpandableListView exlist_lol; private MyBaseExpandableListAdapter myAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; exlist_lol = findViewById(R.id.exlist_lol); gData = new ArrayList<Group>(); iData =new ArrayList<ArrayList<Item>>(); gData.add(new Group("AD")); gData.add(new Group("AP")); gData.add(new Group("TANK")); //AD组 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon3,"剑圣")); lData.add(new Item(R.mipmap.iv_lol_icon4,"德莱文")); lData.add(new Item(R.mipmap.iv_lol_icon13,"男枪")); lData.add(new Item(R.mipmap.iv_lol_icon14,"韦鲁斯")); iData.add(lData); //AP组 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon1, "提莫")); lData.add(new Item(R.mipmap.iv_lol_icon7, "安妮")); lData.add(new Item(R.mipmap.iv_lol_icon8, "天使")); lData.add(new Item(R.mipmap.iv_lol_icon9, "泽拉斯")); lData.add(new Item(R.mipmap.iv_lol_icon11, "狐狸")); iData.add(lData); //TANK组 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon2, "诺手")); lData.add(new Item(R.mipmap.iv_lol_icon5, "德邦")); lData.add(new Item(R.mipmap.iv_lol_icon6, "奥拉夫")); lData.add(new Item(R.mipmap.iv_lol_icon10, "龙女")); lData.add(new Item(R.mipmap.iv_lol_icon12, "狗熊")); iData.add(lData); myAdapter = new MyBaseExpandableListAdapter(gData, iData, mContext); exlist_lol.setAdapter(myAdapter); exlist_lol.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this,iData.get(groupPosition).get(childPosition) .getItemName(),Toast.LENGTH_SHORT).show(); return true; } }); } }其他相关的类以及布局xml,请自行定义。