当 parent 在 Android 中折叠时,如何更改可扩展列表视图 children 的视图?
How to change view of expandable list view children when parent is collapsed in Android?
我正在 ExpandableListView
中实施选择模式。当我单击 child 时,选择会切换。我在每个 parent 中有一个 CheckBox
,我想从中一次控制所有 children 的选择。
我的问题是,当 parent 折叠并单击其 CheckBox
时,应用程序因空指针异常而崩溃,因为当我尝试更改 [=22= 的选择时]ren,我找不到 children 并得到 null。但是当 parent 展开时一切正常。
那么,解决此类问题的好方法是什么?
我通过添加一些代码行而不更改以前的代码来解决,所以这个答案可能对那些不想用不同的方法重写代码的人有帮助。
在调用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 */
}
}
所以,折叠组的children不受影响,但是当组展开时需要更改它们,为此,在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
}
我正在 ExpandableListView
中实施选择模式。当我单击 child 时,选择会切换。我在每个 parent 中有一个 CheckBox
,我想从中一次控制所有 children 的选择。
我的问题是,当 parent 折叠并单击其 CheckBox
时,应用程序因空指针异常而崩溃,因为当我尝试更改 [=22= 的选择时]ren,我找不到 children 并得到 null。但是当 parent 展开时一切正常。
那么,解决此类问题的好方法是什么?
我通过添加一些代码行而不更改以前的代码来解决,所以这个答案可能对那些不想用不同的方法重写代码的人有帮助。
在调用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 */
}
}
所以,折叠组的children不受影响,但是当组展开时需要更改它们,为此,在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
}