目前我正在使用Android架构组件进行应用程序开发,一切都与分页库一起工作 现在我想删除回收器视图 使用PagedListAdapter填充该项目,我们需要添加数据源并从数据源列表使用LiveData进行更新 否 我想从列表中删除项目 通知项目已删除() 正在从PagedList工作 我收到此异常:
java.lang.UnsupportedOperationException
java.util.AbstractList.remove(AbstractList.java:638)
由于您无法直接修改PagedList
中的数据,因为我相信它是不可变的,因此在这种情况下实现项目删除的关键是在代码中的某个位置维护一个支持数据集,该数据集表示您到目前为止收到的所有数据。一个ArrayList
为我工作。
如果要删除某个项目,请将其从后备数据集中删除,并对数据源调用 invalid。这将触发loadInitial()
调用,您可以在其中将后备数据集传递给callback.onResult()
函数。您的PagedListAdapter
将使用您提供的DiffUtil.ItemCallback
来智能地确定其数据已更新,并相应地进行自我更新。
本教程帮助我了解了在使用分页库时正确删除项目的正确流: https://medium.com/@FizzyInTheHall/implementing-swipe-to-delete-with-android-architecture-components-a95165b6c9bd
可在此处找到与本教程关联的存储库: https://gitlab.com/adrianhall/notes-app
根据 Pojo 对象中设置的标志,通过调用临时隐藏列表中的项目 notifyItemUpdate()
if(data?.hasVisible == false) {
itemBinding.root.visibility = View.GONE
itemBinding.root.layoutParams = RecyclerView.LayoutParams(0, 0)
}else{
itemBinding.root.visibility = View.VISIBLE
itemBinding.root.layoutParams = RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT)
}
我遇到了同样的问题。 我的 PagedList 显示数据源工厂从服务器获取的项目。我想出了两种解决方案,如何从列表中删除项目。
- 重新加载整个列表。 进行 API 调用以从服务器中删除项目,然后调用
pagedList.dataSource.invalidate()
. 此解决方案的缺点是清除整个列表,然后从服务器接收所有项目。不完全是我要找的。 - 将结果存储在房间中。然后PagedList将直接从Room获取项目,PagedListAdapter将自行管理删除/添加项目。
在 DAO 对象中
("SELECT * FROM YourModel")
fun getAll(): DataSource.Factory<Int, YourModel>
@Delete
fun delete(item: YourModel)
为了在用户滚动列表时更新数据库,我实现了边界回调。当数据库中没有更多项目要显示时,它会被调用,它可以在同一页面的末尾调用,所以我确保不会多次执行相同的请求(在我的情况下,列表的键是页码)。
class YourModelBoundaryCallback(private val repository: Repository) : PagedList.BoundaryCallback<YourModel>() {
private val requestArray = SparseArray<Disposable>()
private var nextPage = 1
private var lastPage = 1
override fun onZeroItemsLoaded() {
if (requestArray.get(1) == null) {
requestArray.put(1, repository.getFirstPage()
.subscribe({
lastPage = it.total / PAGE_SIZE + if (it.total % PAGE_SIZE == 0) 0 else 1
nextPage++
}))
}
}
override fun onItemAtEndLoaded(itemAtEnd: YourModel) {
if (nextPage > lastPage) {
return
}
if (requestArray.get(nextPage) == null) {
requestArray.put(nextPage, repository.getNextPage(nextPage)
.subscribe({
lastPage = it.total / PAGE_SIZE + if (it.total % PAGE_SIZE == 0) 0 else 1
nextPage++
}))
}
}
override fun onItemAtFrontLoaded(itemAtFront: YourModel) {
// ignored, since we only ever append to what's in the DB
}
}
分页列表实例变成了这个
private val pagedListConfig = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(3)
.setPageSize(PAGE_SIZE)
.build()
val pagedList = LivePagedListBuilder(yourModelDao.getAll(), pagedListConfig)
.setBoundaryCallback(YourModelBoundaryCallback(repository))
.build()
最后要从适配器中删除项目,我只是打电话给yourModelDao.remove(yourModel)
Adapter.notifyItemRemoved(position);
appDatabase.userDao().deleteUser(user);
这对我来说是工作!