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

时间:2019-06-27 22:47:26

标签: android kotlin android-expandable-list-view

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

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

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

1 个答案:

答案 0 :(得分:0)

我通过添加一些代码行而不更改先前的代码来解决问题,因此此答案对于不想用其他方法重写代码的人可能会有所帮助。

在设置了Fragment的呼叫方ActivityAdapter中,添加:

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
}