Обновление адаптера RecyclerView при прокрутке приводит к сбою

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я пытаюсь обновить свой RecyclerView ( notifyDataSetChanged или любой другой « changed » метод), который содержит много типов представлений, но если это происходит во время прокрутки пользователем, это приводит к сбою.

Сообщение о сбое заключается в том, что a ViewHolder не может быть передан другому.

Пример

java.lang.ClassCastException: package.adapters.Адаптер $AlphabetViewHolder не может быть приведен к package.adapters.Адаптер $NumbersViewHolder

Мой вопрос: как я могу обновить RecyclerView , пока пользователь прокручивает его? Есть ли что-то особенное, что я должен сделать?

Ответ №1:

вам необходимо реализовать шаблон observer и некоторую функцию в вашем адаптере, чтобы сообщить наблюдателю (в данном случае activity), когда нужно предоставить больше данных в зависимости от положения ваших элементов.

 interface ScrollObserver {

    fun notifyLoadMore(num: Int): Unit
}
  
 class MainActivity: ScrollObserver {

...

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        adapter.scrollObserver = this
    }

    override fun notifyLoadMore(num: Int) {
        loadMoreData(num)
        updateRecyclerView()
    }

}
  

в вашем адаптере:

 override fun onBindViewHolder(holder: QuestionViewHolder, position: Int) {
    ...
    if (isTimeToLoadMore(position)) {
        scrollObserver.notifyLoadMore(position)
    }
  

вам необходимо реализовать isTimeToLoadMore в соответствии с вашими требованиями. классы упрощены и определенно не работают с копированием-вставкой. но я надеюсь, что вы поняли идею.
вы можете наблюдать за адаптером с помощью viewmodel практически таким же образом!