ROOM如何将两个实体交换为拖放列表

时间:2019-06-10 06:23:36

标签: android android-room android-architecture-components

我正在学习如何将ROOM用作Android体系结构组件的一部分。对于常规的回收者视图,我可以实现(env) > pyinstaller myscript.py -F --hidden-import=xgboost.core --add-data "./env/xgboost/*;xgboost/" --add-data "./env/Lib/site-packages/xgboost/VERSION;xgboost/" 来轻松删除列表中的帖子,而我的onSwipe将直接调用我的存储库以调用ROOM删除给定的帖子。

但是,在尝试实现ViewModel回调时,我遇到了一些问题。回调如下所示:

onMove

从这里我可以得到之前和之后的职位,我天真的想法是我应该能够交换这两个帖子到我的存储库中,并且LiveData会自动更新列表。

但是我不知道如何在public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) DAO部分上进行操作(交换)。如果我朝错误的方向前进,可以请您分享您的想法或纠正我的想法?

2 个答案:

答案 0 :(得分:1)

在您的存储库中,您会发现如下内容:

var allRecords : LiveData<List<Record>> = fragmentDao.getAllRecordsOrderedByIDDesc()

这可确保 Recycler 显示(即 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) 之后调用(在覆盖 fun onMove 中),在覆盖 fun clearView 中调用。

您需要代码来确定新职位。它比'位置 3 处的项移动到位置 5 处更复杂。例如,将适配器位置 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)

在覆盖 fun onMove(...) 然后您可以使用 mutableList 来驱动数据库位置更新。

答案 1 :(得分:0)

For drag and swipe in recyclerview follow this url

但是,如果要保留列表的新顺序。

  • 保持表中位置像1,2,3 ....
  • 使用“房间”查询获取列表-使用位置对项目进行排序
  • 用户拖放,更新数据库中的新位置

    • 获得职位=> viewholder.getAdapterPosition(),target.getAdapterPosition()
  • 当数据库发生更改时,将触发实时数据,您将从数据库中获取新列表。