【问题标题】:Save new positions in Room after recyclerView drag & droprecyclerView拖放后在Room中保存新位置
【发布时间】:2018-11-14 09:50:15
【问题描述】:

我在我的应用中实现了一个带有拖放功能的 recyclerView。在重新启动应用程序之前一切正常——应用程序不会保存/记住任何拖放更改。

我试过了:

我当前的代码如下所示:

在 onCreate 中

 ItemViewModel itemViewModel = ViewModelProviders.of(this).get(ItemViewModel.class);
    itemViewModel.getAllItems().observe(this, new Observer<List<Item>>() {
        @Override
        public void onChanged(List<Item> items) {

         adapter.setItemList(items);
         itemList = items; //Global variable itemList


        }
    });

拖动/移动项目时调用的方法

private void swap(int firstPosition, int secondPosition) {
    Collections.swap(itemList, firstPosition, secondPosition);
        for(int i = 0; i < itemList.size(); i++) {
            Item currentItem = itemList.get(i);
            ItemViewModel.update(currentItem );
        }
        adapter.notifyItemMoved(firstPosition, secondPosition);
     }

有什么想法可以让我的应用在拖放后保存重新排序的 recyclerView 吗?提前致谢。

【问题讨论】:

  • 您的实体中是否有order 属性?如果是这样,您可以访问您的 dao 并在重新排序时在 Collections.swap 方法中运行 UPDATE SQL,而不是在每次加载列表时,返回按该属性排序的项目。
  • @Igor 它没有,虽然我确实包含了一个.update(currentItem) 来更新每个项目——不知何故这不起作用
  • 如果您希望在关闭应用程序或移动到另一个活动后保留项目的顺序,您需要向您的实体文件添加一个属性,该属性将作为它的订单值。因为我认为在应用关闭后没有其他方法可以保持该顺序
  • @Igor 感谢您的建议。按照你说的,我能把它保存下来。如果你愿意,请回复为答案,我会接受:)
  • @LittleNobody 请您出示或联系我,因为我正在寻找相同的答案,我在 SO 添加了一个问题。我正在使用交换来改变位置,但它没有保存到SQLite。下面是我的问题。 stackoverflow.com/questions/54867970/…

标签: android android-recyclerview android-room


【解决方案1】:

如果您希望在关闭应用或移动到另一个活动后保留项目的顺序,则需要向实体文件添加一个属性,该属性将作为它的顺序值。添加后,您可以访问您的 dao 并在重新排序项目时在 Collections.swap 方法中运行 UPDATE SQL,而不是在每次加载列表时,返回按该属性排序的项目。

【讨论】:

  • 我有一个问题,我可以更改位置,但是当我退出应用程序或转到另一个活动时,它们会返回到实际位置。数据使用SQLite保存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多