У меня есть комплекс RecyclerView
, где я использую адаптер с 5 ViewHolders
.Я создал пользовательские разделы, похожие на список контактов.Но в моем recyclerView элементы из одного раздела могут сбросить все внутри другого раздела.Но я не знаю, как это сделать.
То, что я сейчас делаю, - это стираю весь список адаптеров и снова добавляю элементы, что не является эффективным способом сделать это.Также элементы внутри Section 1
содержат CheckBox, который, если установлен, может уничтожить все данные в Section 2
и Section 3
.
OnCheckedChangeListener
и установка состояния CheckBox
из состояния itemList[pos]
устанавливаются внутри onBindViewHolder
(проверка установленного по умолчанию элемента внутри раздела в начале привязки).Если флажок установлен в true, он обновит весь список и вызовет notifyDataSetChanged
. Это сделано потому, что все остальные элементы в разных разделах основаны на отмеченном элементе в первом разделе.
Это вызывает сбои из-за concurrent modification exception
.Каждый раз, когда один из этих элементов снова связывается внутри onBindViewHolder
, проверяется прослушиватель изменений, и весь список обновляется.Если это вызывается 2 или более раз подряд, это приведет к сбою моего приложения.Также, если пользователь будет прокручивать вверх и вниз и элементы Section1 начнут появляться и исчезать, он будет вызывать onBindViewHolder несколько раз подряд => notifyDataSetChanged () вызывается несколько раз => исключение.
Android RecyclerView
действительно не имеет встроенной поддержки разделов.Было бы очень здорово просто установить разделы при запуске как subArrays, а затем вызвать, например, adapter.updateSection(1)
.
Было бы также лучше, если бы я мог сделать отдельные RecyclerView
для каждого раздела, но весь этот RecyclerView имеетбыть прокручиваемымДобавление 4 RecyclerViews
внутри NestedScrollView
убьет механизм утилизации.
Предварительный просмотр кода для обновления элементов:
val selectedVariantFirstSectionJSONObject = getSelectedVariantInJSON(selectedVariantID)
ingredientsItemList.apply {
clear()
add(IngredientHeaderItemNonIconified(getString(R.string.food_ingredients_variant_label)))
addAll(foodVariantsArray)
add(IngredientSectionSeparator())
add(IngredientHeaderItemNonIconified(getString(R.string.food_ingredients_required_ingredients_label)))
add(RequiredIngredient(getVariantRequiredIngredients(selectedVariantJSONObject.getJSONArray(getString(R.string.food_variant_required_ingredients)))))
add(IngredientSectionSeparator())
add(IngredientHeaderItemIconified(getString(R.string.food_ingredients_remove_ingredients_label), TYPE_INGREDIENT_REM))
addAll(removableIngredients)
add(IngredientSectionSeparator())
add(IngredientHeaderItemIconified(getString(R.string.food_ingredients_add_ingredients_label), TYPE_INGREDIENT_OPT))
addAll(optionalIngredients)
}
adapter.notifyDataSetChanged()
Изображение для лучшего понимания (немного сложное):