RecyclerView: изменение содержимого и обновление набора данных не очищают предыдущий результатAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 RecyclerView: изменение содержимого и обновление набора данных не очищают предыдущий результат

Сообщение Anonymous »

У меня есть список моих данных. У меня также есть фильтры, позволяющие выбирать, какие данные в списке я хочу видеть. По умолчанию я вижу все содержимое.
Я создал RecyclerView, который хорошо заполнен. Проблема заключается в изменении списка в RecyclerView.
Когда я выбираю фильтр, я вызываю метод getFilteredCards(), который получает весь контент с примененными фильтрами. Затем это становится новым списком, связанным с RecyclerView.Adapter (например, используемым в getItemCount()).
Я пытаюсь обновить полный такой контент:
private fun refreshData() {
cacheFilteredCards = getFilteredCards() // get new list
notifyDataSetChanged()
}

Фактический результат:
  • После первого фильтра первый элемент остается в списке, все остальные в порядке. удаленный. Затем добавляются все нужные.
  • Для второго фильтра (и всех остальных после) контент просто добавляется внизу списка. Итак, у меня есть предыдущий список + новый отфильтрованный.
Я пытался сделать:
private fun refreshData() {
cacheFilteredCards.clear()
notifyDataSetChanged()
cacheFilteredCards = getFilteredCards() // get new list
notifyDataSetChanged()
}

Но результат тот же. Представление не полностью обновлено, а список обновлен с правильным содержимым.
Как я могу полностью очистить список и сохранить представление recyclerview? (и не делать все элементы невидимыми, так как это плохое решение)
Вот мой полный код:
fun loadList(context: Context, mainView: LinearLayout) {
val viewListener = OwnAdapter()
val spinnerLayout = LinearLayout(context)
spinnerLayout.addView(viewListener.createSpinner(context))
mainView.addView(spinnerLayout)

val view = RecyclerView(context)
view.layoutManager = LinearLayoutManager(context)
view.adapter = viewListener
view.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
mainView.addView(view)
}

Класс OwnAdapter:
class OwnAdapter : RecyclerView.Adapter(), AdapterView.OnItemSelectedListener {

private var cacheFilteredCards = getFilteredCards()

class ViewHolder(view: LinearLayout) : RecyclerView.ViewHolder(view)

private fun getFilteredCards(): MutableMap {
return mutableMapOf() // simplified content, in reality it's well filled according to selected item
}

fun createSeasonSpinner(context: Context): Spinner { // the spinner to select content
val data = getSpinnerData() // this is to simplify the content

val spinner = Spinner(context)
spinner.id = View.generateViewId()
spinnerId = spinner.id
spinner.setAdapter(createSpinnerAdapter(context, data)) // the listener will be this class
spinner.onItemSelectedListener = this
return spinner
}

private fun refreshData() { // refresh data
cacheFilteredCards.clear()
cacheFilteredCards.putAll(getFilteredCards())
notifyDataSetChanged()
}

override fun onItemSelected(parent: AdapterView, view: View?, pos: Int, id: Long) {
if(parent.id == spinnerId) {
val nextSelected = filterData[parent.getItemAtPosition(pos)]
if (nextSelected != selected) { // select new filter
selected = nextSelected
refreshData()
}
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LinearLayout(parent.context))
}

override fun getItemCount(): Int {
return cacheFilteredCards.size
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val card = cacheFilteredCards.keys.toList()[position]
// now setup the item view
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... ious-resul
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»