有时候系统提供的组件并不能提供某些特定的功能,需要我们自己去实现,就比如最近项目中遇到的一个产品属性要实现同一组下的只能单选,而组间的要求可以是多选的,这时系统给我们提供的ExpandableListView就无法满足我们的需求了,需要我们自己去写一些业务逻辑去提供这个功能,下面是功能的效果图

这是未选择时的效果图,下面是选中时的效果图:

这样就实现了我们要的功能...

主要代码如下:

1.Adapter主要代码public class PropertySiftExpandListAdapter extends BaseExpandableListAdapter
{private Context context;private ArrayList<SearchProperty> dataList;private ViewHolder childHolder;private ViewHolder groupHolder;private Options child;private SearchProperty group;private GetPropertyListener propertyListener;public HashMap<Integer, RecordGroup> recordOptions; //哈希表来维护被选中的属性public PropertySiftExpandListAdapter(Context context, ArrayList<SearchProperty> dataList,GetPropertyListener propertyListener){this.context = context;this.dataList = dataList;this.propertyListener = propertyListener;this.recordOptions = new HashMap<Integer, RecordGroup>();}@Overridepublic Object getChild(int groupPosition, int childPosition){return dataList.get(groupPosition).options.get(childPosition);}@Overridepublic long getChildId(int groupPosition, int childPosition){return childPosition;}@Overridepublic int getChildrenCount(int groupPosition){return dataList.get(groupPosition).options.size();}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,ViewGroup parent){if (convertView == null){convertView = LayoutInflater.from(context).inflate(R.layout.property_child_item, null);childHolder = new ViewHolder();childHolder.groupName = (TextView) convertView.findViewById(R.id.property_name);childHolder.checkBox = (CheckBox) convertView.findViewById(R.id.property_box);childHolder.propertyLayout = (RelativeLayout) convertView.findViewById(R.id.search_sift_property);convertView.setTag(childHolder);}else{childHolder = (ViewHolder) convertView.getTag();}childHolder.checkBox.setChecked(false);child = (Options) getChild(groupPosition, childPosition);childHolder.groupName.setText(child.name);childHolder.propertyLayout.setId(getID(groupPosition, childPosition).realId);childHolder.propertyLayout.setTag(R.id.property_one, child);childHolder.propertyLayout.setTag(R.id.property_two, getID(groupPosition, childPosition));//如果哈希表不为空
if (recordOptions.size() != 0){RecordGroup temp = recordOptions.get(groupPosition);if (temp != null){
//将表中存在的属性节点置为选中状态
if (temp.childId == childPosition){childHolder.checkBox.setChecked(true);}}}return convertView;}@Overridepublic Object getGroup(int groupPosition){return dataList.get(groupPosition);}@Overridepublic int getGroupCount(){return dataList.size();}@Overridepublic long getGroupId(int groupPosition){return groupPosition;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent){group = (SearchProperty) getGroup(groupPosition);if (convertView == null){convertView = LayoutInflater.from(context).inflate(R.layout.property_group_item, null);groupHolder = new ViewHolder();groupHolder.groupName = (TextView) convertView.findViewById(R.id.property_name);groupHolder.checkBox = (CheckBox) convertView.findViewById(R.id.property_box);convertView.setTag(groupHolder);}else{groupHolder = (ViewHolder) convertView.getTag();}if (group.choosen.equals("true")){groupHolder.checkBox.setVisibility(View.VISIBLE);}else{groupHolder.checkBox.setVisibility(View.INVISIBLE);}groupHolder.groupName.setText(group.name);return convertView;}class ViewHolder{TextView groupName;CheckBox checkBox;RelativeLayout propertyLayout;}@Overridepublic boolean hasStableIds(){return true;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition){return true;}public RecordGroup getID(int groupPosition, int childPosition){String id = String.valueOf(groupPosition) + String.valueOf(childPosition);return new RecordGroup(id, groupPosition, childPosition);}public interface GetPropertyListener{public void getPropertyData(int groupId, Options property);}/***   此处根据点击的不同,利用HashMap将选中的数据保存起来,以便跟新为选中状态*public void changeStyle(RecordGroup record, Options options){// 判断是否已经存在此组IDif (recordOptions.containsKey(record.groupId)){// 取出此组IDRecordGroup tempRecord = recordOptions.get(record.groupId);if (tempRecord.childId != record.childId){recordOptions.put(tempRecord.groupId, record);propertyListener.getPropertyData(tempRecord.groupId, options);}else{recordOptions.remove(record.groupId);propertyListener.getPropertyData(tempRecord.groupId, null);}}else{recordOptions.put(record.groupId, record);propertyListener.getPropertyData(record.groupId, options);}notifyDataSetChanged();}
}
<pre name="code" class="java"><pre name="code" class="java">自定义一个实体类,用来区分不同的选项。
public class RecordGroup
{public int realId;public int groupId;public int childId;public RecordGroup(String realId, int groupId, int childId){this.realId = Integer.parseInt(realId);this.groupId = groupId;this.childId = childId;}
}

Activity中的主要代码:private OnChildClickListener onChildListener = new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { changeDoneButton(); Options option = (Options) propertyExpandListAdapter.getChild(groupPosition, childPosition); //通知Adapter更新自己.
propertyExpandListAdapter .changeStyle(propertyExpandListAdapter.getID(groupPosition, childPosition), option); return true; } };

以上就是我们实现此功能的主要代码。

思路:

将点击的不同选项用HashMap保存起来,存入Map时,先判断是否有相同的组ID,没有则直接添加,有则跟新为最新的组ID。存子项时,思路与存组时的思路是一致的。

第一次写博客,如有写的不好的地方请指出,代码有不懂的可以向我要源码,谢谢大家。

ExpandableListView实现组内单选,组间多选功能相关推荐

  1. 【CodeForces - 294B】Shaass and Bookshelf(枚举,贪心,思维,组内贪心组间dp)

    题干: Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshelf's dim ...

  2. graphpad如何检测方差齐_SPSS和GraphPad如何比较组内和组间差异「杏花开生物医药统计」...

    在生物医药统计分析中,经常会遇到这样一类问题.样本分了实验组和对照组,而又同时进行了一种干预手段,在干预前和干预后进行了分别测量数据.这时候既要考虑实验组和对照组之间的比较,又要考虑干预前和干预后的对 ...

  3. graphpad两组t检验_SPSS如何比较样本两组样本的组内和组间差异(含GraphPad Prism绘图)...

    在生物医药统计分析中,经常会遇到这样一类问题.样本分了实验组和对照组,而又同时进行了一种干预手段,在干预前和干预后进行了分别测量数据.这时候既要考虑实验组和对照组之间的比较,又要考虑干预前和干预后的对 ...

  4. AD20设置差分线的组内与组间等长详细步骤

    1.在PCB界面右下角点击panels,选择"PCB"选项,则左下角就会出现PCB的窗口选项 2.在PCB窗口内,将上面的下拉菜单选择Differential Pairs Edit ...

  5. 【ZOJ - 4019】Schrödinger's Knapsack (dp,背包,贪心,组内贪心组间dp)

    题干: 有两种物品,k分别为k1,k2,有大小各不一的这两种物品若干,放入容量为c的背包中,能获得求最大的值.放的顺序会影响结果.每次放入一物品,其获得的值都可以用v=kr计算,r表示放入后背包剩下的 ...

  6. 窗口函数:实现组内百分比、累计值、累计百分比

    0 前言 最近做数据分析,需要求每一组内的元素的百分比以及累计百分比,实在想不出怎么使用sql实现,就先将数据导出,然后使用excel计算.趁着夜深人静的时候,思维敏捷,尝试一下使用窗口函数实现一下, ...

  7. excel-vba组内离均差

    Sub 组内离均差() ' ' 组内平均值 Macro ' 宏由 zzh_my@163.com 录制,时间: 2015/11/18 ' '点名    初始化时间(s)   测量时刻    次序号  平 ...

  8. 单播 广播 组播_组播概念3

    一.IGMP Message 1.组成员一旦开启IGMP,会自动发送Membership Report消息到叶路由器 2.IGMPv2版本,组成员退出组会发送leave消息,IGMPv1不会 3.也就 ...

  9. 有各组方差怎么算组间平方和_方差分析中组内离差平方和,组间离差平方和的意义...

    方差分析:组间离差平方和组内离差平方的定义是什么? 1. 方差分析的概念 方差分析(ANOVA)又称变异数分析或F检验,其目的是推断两组或多组资料的总体均数是否相同,检验两个或多个样本均数的差异是否有 ...

  10. 在线作图|差异柱状图(组内)

    组内差异柱状图 柱状图又称条形图,是一种以长方形的长度为变量的统计图表,用来比较两个或多个的含量或者丰度(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析.在生信数据分析中,比较组间差 ...

最新文章

  1. 前台更新进度条js-4
  2. POJ 3070 Fibonacci(矩阵快速幂入门、模板)
  3. https的那些事儿
  4. javamac系统通过pid获取进程名称_线上环境 Linux 系统调用追踪
  5. h5 canvas 显示rgb
  6. HelloMyBLOG!!!
  7. 57. Android之程序调试LogCat (转)
  8. 「前端工程化」该怎么理解?
  9. Swift - RunTime(动态性) 问题 浅析
  10. 计算机睡眠功能命令,windows睡眠命令怎么使用
  11. 玩转位图(bitmap)
  12. java向注册表单传递数据php_form表单传递数组数据、php脚本接收的实例
  13. 怎么样快速修改HOSTS文件?让火绒等小工具来帮忙
  14. 一路狂奔的“幸运咖”,再造下一个“蜜雪冰城”?
  15. 苹果的破局几招:修漏洞、降价、官方认证翻新机……...
  16. bootstrap~去除input选中时的蓝色边框线
  17. 自从掌握了Google和百度的 16 个高级搜索技巧,我再也没有解决不了的 bug 了
  18. 北京市公安局“人工智能安全研究中心”和“关键信息基础设施保护中心”2022年公开招聘工作人员公告
  19. vivado综合出现“PID not specified”问题的参考解决方法
  20. solidworks大型装配体慢卡顿怎么办?来看专业的装配设计与仿真工作站是怎么解决的!

热门文章

  1. 计算机组成原理:二进制与十进制互转
  2. Python:学习笔记之函数的递归
  3. java数据流更新文件内容,数据流 · Java 文件操作 · 看云
  4. Windows10:将cmd命令行添加到右键中的方法
  5. 设计模式(7)——适配器模式
  6. Java中使用各种方式实现网页跳转
  7. 自动驾驶高精地图-概述与分析
  8. ubuntu14.04 出现symbol lookup error
  9. 机器学习笔记【二】逻辑回归与分类(2):感知机学习算法与逻辑回归的区别,牛顿方法
  10. 机器学习笔记【一】- 线性回归(末):统计学推导以及局部加权线性回归算法实例