我正在学习如何将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
部分上进行操作(交换)。如果我朝错误的方向前进,可以请您分享您的想法或纠正我的想法?
答案 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
但是,如果要保留列表的新顺序。
用户拖放,更新数据库中的新位置
当数据库发生更改时,将触发实时数据,您将从数据库中获取新列表。