我正在学习如何使用空间作为Android体系结构组件的一部分。对于定期的回收视图,我能够实现onSwipe轻松删除列表上的帖子,而我的ViewModel将直接打电话给我的存储库来删除给定的帖子。
但是,当我还试图实现onMove回调时,我遇到了一些问题。回调如下:
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) 从这里我可以得到前后的位置,我天真的想法是,我应该能够交换,这两个帖子在我的仓库和我的LiveData将自动更新列表。
但我不知道如何对和ROOM部件执行操作()。如果我走错了方向,你能告诉我你的想法或纠正我吗?
发布于 2021-02-08 01:09:05
在您的存储库中,您将发现如下内容:
var allRecords : LiveData<List<Record>> = fragmentDao.getAllRecordsOrderedByIDDesc()
这将确保回收器显示(即LiveData)与数据库的任何插入、更新等保持一致。
在DAO中,您将看到如下内容:
@Query ("SELECT * from record_table ORDER BY id DESC" )
fun getAllRecordssOrderedByIDDesc(): LiveData<List<Record>>因为拖放后不能修改id,所以需要一个新的数据库列来记录位置。让我们称其为“位置”。您的LiveData现在是:
var allRecords : LiveData<List<Record>> = fragmentDao.getAllRecordsOrderedByPositionDesc()根据:
@Query ("SELECT * from record_table ORDER BY position DESC" )
fun getAllRecordssOrderedByPositionDesc(): LiveData<List<Record>>一旦在数据库中记录了一个新的位置,它就是持久的,即您可以停止应用程序,重新启动它,并且记录仍然会出现在新的位置中(LiveData使用从数据库读取的位置,如前所述)。
另一种方法是使用首选项记录拖放更改。在加载数据库之后,将应用这些内容。有正反两方面的。更新数据库中的位置可以通过一个数据库更新来完成,这个更新在recyclerView.adapter.notifyItemMoved(from,to)之后调用(在重写有趣的onMove中),在覆盖乐趣clearView中。
你需要代码来确定新的位置。它比‘位置3的项转到位置5的.For示例要复杂得多,在适配器位置3将项拖动到位置10意味着以下更改:
3 -> null
4 -> 3
5 -> 4
...
9 -> 8
10 -> 9
and finally 3 -> 10可以使用java.util,Collections.swap:
from = viewHolder.adapterPosition
to = target.adapterPosition
Collections.swap(mutableList, from, to)在覆盖乐趣onMove(.)然后可以使用mutableList驱动数据库位置更新。
发布于 2019-06-10 10:55:24
但是,如果要持久化列表的新顺序。
- to get positions => viewholder.getAdapterPosition() ,target.getAdapterPosition()
https://stackoverflow.com/questions/56521420
复制相似问题