一、概述
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下载地址
《鸣潮》2.3前瞻兑换码大全
《弓箭传说2》新手玩法介绍
《地下城与勇士:起源》断桥烟雨多买多送活动内容一览
《差不多高手》醉拳龙技能特点分享
《鬼谷八荒》毕方尾羽解除限制道具推荐
《地下城与勇士:起源》阿拉德首次迎新春活动内容一览
火柴人绳索英雄2无限金币版 (Stickman Rope Hero 2)安卓版v2.2v3.4.2
奥特曼之格斗超人内测版本 安卓最新版v11.0.0
奥特曼之格斗超人百度版 安卓版v11.0.0
奥特曼之格斗超人4399游戏盒版 最新安卓版v11.0.0
德凯奥特曼D闪光剑模拟器 安卓版v1.0
德凯奥特曼D闪光剑模拟器是一个非常有趣的奥特曼变身模拟器,可
亚刻觉醒器 安卓版v1.1
亚刻觉醒器模拟器是一个非常有趣的奥特曼变身模拟器,为喜欢亚刻
海上餐厅无限金币版 v1.0
海上餐厅免广告版是游戏的破解版本,在该版本中为玩家去除了广告
阿西美女室友竟然全解锁版 v1.0.2
阿西美女室友竟然内置菜单版是游戏的破解版本,在该版本中为玩家
我是大东家正版 最新版v1.2.738
我是大东家正版是一款放置类模拟经营手游,玩家将回到古代成为家