当父母在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】:
我通过添加一些代码行而不更改以前的代码来解决,所以这个答案可能对不想用不同方法重写代码的人有所帮助。
在调用Fragment
或Activity
中,设置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中折叠时如何更改可扩展列表视图子项的视图?的主要内容,如果未能解决你的问题,请参考以下文章