如何删除/删除PagedListAdapter项

Far*_*eel 13 android android-recyclerview android-architecture-components

目前我正在使用Android架构组件进行App开发一切都与分页库一起工作现在我想删除recyclerview项目使用PagedListAdapter来填充这个我们需要添加数据源并且从数据源列表正在使用LiveData更新我想要删除列表notifyItemRemoved()中的项目正在从PagedList工作我收到此异常:

java.lang.UnsupportedOperationException


java.util.AbstractList.remove(AbstractList.java:638)
Run Code Online (Sandbox Code Playgroud)

Tyl*_*ett 5

由于您不能直接修改您拥有的数据,PagedList因为我认为它是不可变的,因此在这种情况下实现删除项目的关键是在代码中的某个位置维护一个支持数据集,该数据代表了到目前为止您已收到的所有数据。一个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

  • 该解决方案似乎重新加载了整个RecyclerView,而不是@cleanOK提出的第二个解决方案。 (3认同)
  • 因此,当loadInitial()调用被触发时,您需要将支持数据集传递给回调,并且已经设置的DiffUtil逻辑将计算RecyclerView适配器中的内容与新传入的数据之间的差异。我不相信它将触发完全重新加载,因为DiffUtil的目的是避免这种情况-PagedListAdapter将使用它来帮助计算后台线程上的细粒度更新。如果可以的话,我绝对建议您将Room与分页库一起使用-但对于不能这样做的情况,我认为这是一个不错的选择。 (2认同)

小智 0

Adapter.notifyItemRemoved(position); appDatabase.userDao().deleteUser(user); 这对我来说是工作!

  • 如果我们不使用 Room 该怎么办? (23认同)
  • 您通知适配器然后删除用户吗?那没有意义! (7认同)
  • 是的,如果你知道物体但不知道位置怎么办 (2认同)