android - 滚动时更新 RecyclerView 适配器会导致崩溃
问题描述
我正在尝试更新包含许多视图类型的RecyclerView
(notifyDataSetChanged
或任何其他“ changed
”方法),但如果在用户滚动时发生,则会导致崩溃。
崩溃的信息是 aViewHolder
不能转换为另一个。
例子
java.lang.ClassCastException:package.adapters.Adapter$AlphabetViewHolder 无法转换为 package.adapters.Adapter$NumbersViewHolder
我的问题是:如何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 的适配器!
推荐阅读
- android - 如何使用 VSCode 获取 FirebaseInstanceId?
- django - 如果数据库在另一个容器中,如何迁移到 dockerfile?
- html - Font-Awesome CSS 文件不工作,但 Font-Awesome CDN 工作。为什么?
- azure-devops - 检查工作人员是自托管的还是 Azure 运营的
- java - 如何修复测试依赖项中的拆分包?
- java - 使用 openjfx 插件时,Gradle 不会在 Mac 上的 Eclipse 中构建 Java 路径
- azure-devops - 在 Azure Devops 中创建角色用户后将 AzureAD 链接到组织域的影响
- javascript - 在酶中模拟焦点不会改变 document.activeElement
- javascript - 如何实现计数缺失括号?
- node.js - 使用nodejs将数据库(sql server)中的数据保存到全局变量中