Как обновить только один раздел списка в программе - PullRequest
0 голосов
/ 15 июня 2019

У меня есть комплекс 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()

Изображение для лучшего понимания (немного сложное):

enter image description here

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вы можете просто позвонить RvAdapter.notifyItemRangeChanged(start,count); и то же самое для вспомогательных адаптеров, если у вас есть

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

Если у вас есть измененные позиции элементов, просто передайте их, запустите следующий метод в цикле списка, в котором есть позиции измененных данных.

 public void updateItem(Data Data, int position) {
        mDataList.add(position, data);
        notifyItemChanged(position);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...