#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 практически таким же образом!