如何删除/删除PagedListAdapter项

时间:2018-01-09 17:12:13

标签: android android-recyclerview android-architecture-components

目前我正在使用 Android架构组件进行App开发一切都与分页库一起工作现在我想使用PagedListAdapter删除recyclerview Item以填充我们需要添加数据源和数据源列表正在使用LiveData更新否我想要从列表中删除一个项目notifyItemRemoved()正在从PagedList工作我得到了这个例外:

java.lang.UnsupportedOperationException


java.util.AbstractList.remove(AbstractList.java:638)

4 个答案:

答案 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工厂从服务器获取的项目。我想出了两种解决方案,如何从列表中删除项目。

  1. 重新加载整个列表。 进行API调用以从服务器中删除项目,然后调用 pagedList.dataSource.invalidate()。 该解决方案的缺点是清除了整个列表,然后从服务器接收了所有项目。并不是我要找的东西。
  2. 将结果存储在Room中。然后,PagedList将直接从Room中获取项目,而PagedListAdapter将自行管理删除/添加项目。

在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)
        }