首页 > 解决方案 > 滚动时更新 RecyclerView 适配器会导致崩溃

问题描述

我正在尝试更新包含许多视图类型的RecyclerViewnotifyDataSetChanged或任何其他“ changed”方法),但如果在用户滚动时发生,则会导致崩溃。

崩溃的信息是 aViewHolder不能转换为另一个。

例子

java.lang.ClassCastException:package.adapters.Adapter$AlphabetViewHolder 无法转换为 package.adapters.Adapter$NumbersViewHolder

我的问题是:如何RecyclerView在用户滚动时更新它?我有什么特别需要做的吗?

标签: androidandroid-recyclerview

解决方案


您需要在适配器中实现观察者模式和一些功能,以告诉观察者(在本例中为活动)何时根据项目的位置提供更多数据。

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 的适配器!


推荐阅读