当父母在Android中折叠时如何更改可扩展列表视图子项的视图?

Posted

技术标签:

【中文标题】当父母在Android中折叠时如何更改可扩展列表视图子项的视图?【英文标题】:How to change view of expandable list view children when parent is collapsed in Android? 【发布时间】:2019-11-09 23:01:46 【问题描述】:

我正在ExpandableListView 中实现选择模式。当我单击一个孩子时,选择会切换。我在每个父母中都有一个CheckBox,我想从中控制所有孩子的选择。

我的问题是,当父级折叠并单击其CheckBox 时,应用程序由于空指针异常而崩溃,因为当我尝试更改子级的选择时,我找不到子级并获得 null .但是当父级展开时一切正常。

那么,解决此类问题的好方法是什么?

【问题讨论】:

不要尝试更改CheckBox 的选择。您的数据模型可以有一个名为 isSelected 的布尔字段。当您想选中/取消选中所有孩子时,只需更改所有孩子的布尔标志。然后,在你的onBindViewHolder 上,说checkBox.setChecked(item.isSelected()) 我想改变调用片段活动中的选择,而且我不认为ExpandableListView中是否有onBindViewHolder方法 对不起。我误解了。我以为你在使用带有可扩展适配器的RecyclerView。我建议你使用一个库来处理你需要的所有东西。我以前亲自使用过这个,效果很好 - github.com/thoughtbot/… @ᴛʜᴇᴘᴀᴛᴇʟ 我认为您链接的库在父级上没有复选框,虽然我已经在子级上实现了选择,但我认为我不需要这个库 【参考方案1】:

我通过添加一些代码行而不更改以前的代码来解决,所以这个答案可能对不想用不同方法重写代码的人有所帮助。

在调用FragmentActivity 中,设置Adapter,添加:

private val isMyGroupExpanded = SparseBooleanArray()
val MyAdapterEV = AdapterEV(/* params */)  isChecked, groupPosition ->
    changeSelection(isChecked, groupPosition)

// record which groups are expanded and which are not
MyAdapterEV.setOnGroupExpandListener  i -> isMyGroupExpanded.put(i, true) 
MyAdapterEV.setOnGroupCollapseListener  i -> isMyGroupExpanded.put(i, false) 
// and where changing the selection of child
private fun changeSelection(isChecked: Boolean, groupPosition: Int) 
    if (isMyGroupExpanded.get(groupPosition, false))  
        /* change only if the group is expanded */ 
    

所以,折叠组的孩子不受影响,但需要在组展开时更改它们,为此,在Adapter中添加几行代码:

private val isGroupChecked = SparseBooleanArray()
// inside override fun getGroupView(...
MyCheckBoxView.setOnCheckedChangeListener  _, isChecked ->
    onCheckedChangeListener(isChecked, groupPosition)
    isGroupChecked.put(groupPosition, isChecked)

// inside override fun getChildView(...
if (isGroupChecked.contains(groupPosition)) 
    myView.visibility = if (isGroupChecked.get(groupPosition)) View.VISIBLE else View.INVISIBLE

【讨论】:

以上是关于当父母在Android中折叠时如何更改可扩展列表视图子项的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建可扩展列表?

在可扩展列表视图android中折叠除选定组之外的所有组

如何快速制作嵌套的可折叠 uitableview?

单击时可扩展的listview android更改布局

OctoberCMS - 如何使可折叠列表默认仅在非移动设备上处于活动状态

当列表视图中的扩展器折叠时,无法让 WPF 列表视图折叠