Я создал 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