一、概述
ExpandableListView是常用的一个控件,今天自己做了个小练习,主要需求是单选以及多选的实现,看似比较简单,但是还是比较复杂,把代码贴给大家,有这种需求的可以参考一下。
二、效果截图
三、实现过程
activity_main.xml
group_item.xml
listview_item.xml
MainAcitivity.java
public class MainActivity extends Activity { private List> parentList = new ArrayList>(); private List>> childData = new ArrayList>>(); private ExpandableListView exListView; private Context context = this; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); setListener(); } /** * 记录正在选中的子listview的item条目 用hashset是为了去除重复值 */ private HashSet hashSet; private void setListener() { exListView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { //存取已选定的集合 hashSet = new HashSet(); } }); // ExpandableListView的Group的点击事件 exListView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // 可以写点击后实现的功能 return false; } }); // ExpandableListView的child的点击事件 exListView.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Map map = childData.get(groupPosition).get( childPosition); String childChecked = map.get("isChecked"); if ("No".equals(childChecked)) { map.put("isChecked", "Yes"); hashSet.add("选定" + childPosition); } else { map.put("isChecked", "No"); if (hashSet.contains("选定" + childPosition)) { hashSet.remove("选定" + childPosition); } } System.out.println("选定的长度==1" + hashSet.size()); System.out.println("选定的长度==2" + childData.get(groupPosition).size()); if (hashSet.size() == childData.get(groupPosition).size()) { parentList.get(groupPosition).put("isGroupCheckd", "Yes"); } else { parentList.get(groupPosition).put("isGroupCheckd", "No"); } adapter.notifyDataSetChanged(); return false; } }); } // 初始化数据 private void initData() { for (int i = 0; i < 10; i++) { Map groupMap = new HashMap(); groupMap.put("groupText", "item" + i); groupMap.put("isGroupCheckd", "No"); parentList.add(groupMap); } for (int i = 0; i < 10; i++) { List> list = new ArrayList>(); for (int j = 0; j < 4; j++) { Map map = new HashMap(); map.put("childItem", "childItem" + j); map.put("isChecked", "No"); list.add(map); } childData.add(list); } adapter = new MyAdapter(); exListView.setAdapter(adapter); exListView.expandGroup(0); hashSet = new HashSet(); } private void initView() { exListView = (ExpandableListView) findViewById(R.id.exlistview); } /** * 适配adapter */ private class MyAdapter extends BaseExpandableListAdapter { @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childData.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(context, R.layout.listview_item, null); holder.childText = (TextView) convertView .findViewById(R.id.id_text); holder.childBox = (CheckBox) convertView .findViewById(R.id.id_checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.childText.setText(childData.get(groupPosition) .get(childPosition).get("childItem")); String isChecked = childData.get(groupPosition).get(childPosition) .get("isChecked"); if ("No".equals(isChecked)) { holder.childBox.setChecked(false); } else { holder.childBox.setChecked(true); } return convertView; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return childData.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return parentList.get(groupPosition); } @Override public int getGroupCount() { // TODO Auto-generated method stub return parentList.size(); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(context, R.layout.group_item, null); holder.groupText = (TextView) convertView .findViewById(R.id.id_group_text); holder.groupBox = (CheckBox) convertView .findViewById(R.id.id_group_checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.groupText.setText(parentList.get(groupPosition).get( "groupText")); final String isGroupCheckd = parentList.get(groupPosition).get( "isGroupCheckd"); if ("No".equals(isGroupCheckd)) { holder.groupBox.setChecked(false); } else { holder.groupBox.setChecked(true); } /* * groupListView的点击事件 */ holder.groupBox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox groupBox = (CheckBox) v .findViewById(R.id.id_group_checkbox); if (!isExpanded) { //展开某个group view exListView.expandGroup(groupPosition); } else { //关闭某个group view exListView.collapseGroup(groupPosition); } if ("No".equals(isGroupCheckd)) { exListView.expandGroup(groupPosition); groupBox.setChecked(true); parentList.get(groupPosition).put("isGroupCheckd", "Yes"); List> list = childData .get(groupPosition); for (Map map : list) { map.put("isChecked", "Yes"); } } else { groupBox.setChecked(false); parentList.get(groupPosition) .put("isGroupCheckd", "No"); List> list = childData .get(groupPosition); for (Map map : list) { map.put("isChecked", "No"); } } notifyDataSetChanged(); } }); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } private class ViewHolder { TextView groupText, childText; CheckBox groupBox, childBox; } }
四、总结及注意点
1、设置CheckBox的点击事件,而非别的
2、exListView.collapseGroup(groupPosition); 关闭正展开的子ListView.
这是demo地址,欢迎下载:
Demo下载地址
碧蓝航线夕立改立绘一览攻略
空投多USDC客户端有哪些?稳定USDC客户端排行榜2025年
逆水寒手游且将新火试新茶快速获取指南
光遇暮土神龛位置汇总完整版
DNF手游试炼之塔15层较好的打法
DNF手游纯净的黄金增幅书获取方法有哪些
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
火柴人传说暗影格斗内置菜单 最新版v3.0.1
荒野乱斗测试服 安卓版v61.10.3
荒野乱斗彩虹服 安卓版v61.10.3
寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔