Android 房间如何将两个实体交换为拖动&;下拉列表

Android 房间如何将两个实体交换为拖动&;下拉列表,android,android-room,android-architecture-components,Android,Android Room,Android Architecture Components,我正在学习如何使用ROOM作为Android架构组件的一部分。对于常规的recyclerviews,我能够实现onswip轻松删除列表中的帖子,我的ViewModel将直接调用我的存储库调用ROOM删除给定帖子 然而,当我试图同时实现onMove回调时,我遇到了一些问题。回调函数如下所示: public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.Vi

我正在学习如何使用ROOM作为Android架构组件的一部分。对于常规的recyclerviews,我能够实现
onswip
轻松删除列表中的帖子,我的
ViewModel
将直接调用我的存储库调用ROOM删除给定帖子

然而,当我试图同时实现
onMove
回调时,我遇到了一些问题。回调函数如下所示:

public boolean onMove(@NonNull RecyclerView recyclerView,
                      @NonNull RecyclerView.ViewHolder viewHolder,
                      @NonNull RecyclerView.ViewHolder target) 
从这里我可以得到前后位置,我天真的想法是,我应该能够在我的存储库中交换这两篇文章,我的LiveData将自动更新列表

但是我不知道如何在
DAO
ROOM
部件上进行操作(swap)。如果我走错了方向,你能告诉我你的想法吗

但是,如果您想保持列表的新顺序

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

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


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

var-allRecords:LiveData=fragmentDao.getallrecordsorderedbyddesc()

这确保了进入回收器显示的提要(即LiveData)与数据库的任何插入、更新等都是最新的

在DAO中,您将看到如下内容:

@Query ("SELECT * from record_table ORDER BY id DESC" )
fun getAllRecordssOrderedByIDDesc(): LiveData<List<Record>>
可以使用java.util、Collections.swap:

from = viewHolder.adapterPosition
to = target.adapterPosition
Collections.swap(mutableList, from, to)

在override fun onMove(…)中,您可以使用可变列表驱动数据库位置更新。

我以前读过这篇文章。但我并不确定如何实现“更新数据库中的新位置”部分。您能提供一些示例代码片段吗?我认为只有我们能够更新数据库,livedata才会自动更新UI,对吗?@IHC\u Applroid。。是的,您只需要更新数据库中的位置,livedata将回调以使用新列表更新ui。将更新列表设置为适配器并调用notifydatasetchanged()。这将返回到我的OP,我不确定如何交换位置。
@Query ("SELECT * from record_table ORDER BY position DESC" )
 fun getAllRecordssOrderedByPositionDesc(): LiveData<List<Record>>
3 -> null
4 -> 3
5 -> 4
...

9 -> 8
10 -> 9
and finally 3 -> 10
from = viewHolder.adapterPosition
to = target.adapterPosition
Collections.swap(mutableList, from, to)