Как изменить представление расширяемого списка дочерних представлений, когда родитель свернут в Android? - PullRequest
0 голосов
/ 28 июня 2019

Я реализую режим выбора в ExpandableListView. Выбор переключается, когда я щелкаю ребенка. У меня есть CheckBox у каждого родителя, из которого я хочу контролировать выбор всех детей одновременно.

Моя проблема в том, что, когда родительский узел свернут, и я щелкаю его CheckBox, приложение вылетает из-за исключения нулевого указателя, потому что, когда я пытаюсь изменить выбор дочерних элементов, я не могу найти дочерние элементы и получить нулевой , Но все работает нормально, когда родительский узел расширен.

Итак, каков хороший подход к решению такой проблемы?

1 Ответ

0 голосов
/ 28 июня 2019

Я решил добавить несколько строк кода без изменения предыдущего кода, поэтому этот ответ может быть полезен для тех, кто не хочет переписывать код другим подходом.

В вызове 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
}
...