首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房间如何将两个实体替换为拖放列表

问房间如何将两个实体替换为拖放列表
EN

Stack Overflow用户
提问于 2019-06-10 06:23:36
回答 2查看 1K关注 0票数 1

我正在学习如何使用空间作为Android体系结构组件的一部分。对于定期的回收视图,我能够实现onSwipe轻松删除列表上的帖子,而我的ViewModel将直接打电话给我的存储库来删除给定的帖子。

但是,当我还试图实现onMove回调时,我遇到了一些问题。回调如下:

代码语言:javascript
复制
public boolean onMove(@NonNull RecyclerView recyclerView,
                      @NonNull RecyclerView.ViewHolder viewHolder,
                      @NonNull RecyclerView.ViewHolder target) 

从这里我可以得到前后的位置,我天真的想法是,我应该能够交换,这两个帖子在我的仓库和我的LiveData将自动更新列表。

但我不知道如何对和ROOM部件执行操作()。如果我走错了方向,你能告诉我你的想法或纠正我吗?

EN

回答 2

Stack Overflow用户

发布于 2021-02-08 01:09:05

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

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

这将确保回收器显示(即LiveData)与数据库的任何插入、更新等保持一致。

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

代码语言:javascript
复制
@Query ("SELECT * from record_table ORDER BY id DESC" )
fun getAllRecordssOrderedByIDDesc(): LiveData<List<Record>>

因为拖放后不能修改id,所以需要一个新的数据库列来记录位置。让我们称其为“位置”。您的LiveData现在是:

代码语言:javascript
复制
var allRecords : LiveData<List<Record>> = fragmentDao.getAllRecordsOrderedByPositionDesc()

根据:

代码语言:javascript
复制
@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意味着以下更改:

代码语言:javascript
复制
3 -> null
4 -> 3
5 -> 4
...

9 -> 8
10 -> 9
and finally 3 -> 10

可以使用java.util,Collections.swap:

代码语言:javascript
复制
from = viewHolder.adapterPosition
to = target.adapterPosition
Collections.swap(mutableList, from, to)

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

票数 1
EN

Stack Overflow用户

发布于 2019-06-10 10:55:24

若要在回收视图中拖动和滑动,请按以下网址操作

但是,如果要持久化列表的新顺序。

  • 保持1,2,3的位置.
  • 使用Room query获取列表--使用位置对项目进行排序
  • 用户拖放,更新数据库中的新位置。
代码语言:javascript
复制
- to get positions => viewholder.getAdapterPosition() ,target.getAdapterPosition()

​

  • 当数据库发生更改时,Livedata将被触发,您将从数据库中获得新的列表。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56521420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档