目前我正在使用 Android架构组件进行App开发一切都与分页库一起工作现在我想使用PagedListAdapter删除recyclerview Item以填充我们需要添加数据源和数据源列表正在使用LiveData更新否我想要从列表中删除一个项目notifyItemRemoved()正在从PagedList工作我得到了这个例外:
java.lang.UnsupportedOperationException
java.util.AbstractList.remove(AbstractList.java:638)
答案 0 :(得分:3)
由于您不能直接修改PagedList
中的数据,因为我认为它是不可变的,因此在这种情况下实现删除项目的关键是在某处维护 backing data 在您的代码中,它代表了您到目前为止已收到的所有数据。 ArrayList
为我工作。
要删除项目时,请将其从支持数据集中删除,并在数据源上调用invalidate。这将触发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
答案 1 :(得分:1)
Adapter.notifyItemRemoved(position);
appDatabase.userDao().deleteUser(user);
这对我有用!
答案 2 :(得分:1)
我有同样的问题。 我的PagedList显示了DataSource工厂从服务器获取的项目。我想出了两种解决方案,如何从列表中删除项目。
pagedList.dataSource.invalidate()
。
该解决方案的缺点是清除了整个列表,然后从服务器接收了所有项目。并不是我要找的东西。在DAO对象中
("SELECT * FROM YourModel")
fun getAll(): DataSource.Factory<Int, YourModel>
@Delete
fun delete(item: YourModel)
要在用户滚动列表时更新数据库,我实现了BoundaryCallback。当数据库中没有更多项目可显示时被调用,可以在同一页面的末尾调用它,因此我确保不会多次执行相同的请求(在我的情况下,列表的键是页面号)。
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
}
}
PagedList实例变成了这个
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)
答案 3 :(得分:0)
根据Pojo对象中设置的标志,通过调用notifyItemUpdated()暂时隐藏列表中的项目
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)
}