一、概述
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下载地址
无期迷途哈梅尔依偎涟漪怎么样
剑与远征折翼苍空攻略
光遇11.25每日任务怎么做 光遇11月25日每日任务做法攻略
光遇11.25季节蜡烛在哪里 光遇11月25日季节蜡烛位置攻略
崩坏星穹铁道2.7前瞻有什么活动 崩铁2.7版本前瞻新增内容介绍
“十月朝,糍粑碌碌烧”是说哪个习俗 蚂蚁庄园11月22日答案最新
沙威玛传奇安卓版
战盟大乱斗最新版
大侠立志传最新版
苍翼混沌效应最新版
驯龙高手旅程安卓版
一款以奇幻世界为背景的模拟经营游戏
全民农场最新版
一款轻松风格的农场经营类型的游戏
散修功德模拟器完整版
散修功德模拟器游戏是一款以功德修炼为题材的模拟游戏
我的毕业日记无限金币下载
开始毕业后的新生活吧!
城堡之梦拼图和装饰下载最新版
城堡之梦拼图和装饰玩家将会在游戏当中感受更多的乐趣体验,你可