【发布时间】:2018-11-14 09:50:15
【问题描述】:
我在我的应用中实现了一个带有拖放功能的 recyclerView。在重新启动应用程序之前一切正常——应用程序不会保存/记住任何拖放更改。
我试过了:
- 使用 SharedPreference + GSON
- 在这里阅读其他 SQLite 答案,例如:Store new position of RecyclerView items in SQLite after being dragged and dropped
- 阅读Paul Burke's Medium Post
我当前的代码如下所示:
在 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方法中运行UPDATESQL,而不是在每次加载列表时,返回按该属性排序的项目。 -
@Igor 它没有,虽然我确实包含了一个
.update(currentItem)来更新每个项目——不知何故这不起作用 -
如果您希望在关闭应用程序或移动到另一个活动后保留项目的顺序,您需要向您的实体文件添加一个属性,该属性将作为它的订单值。因为我认为在应用关闭后没有其他方法可以保持该顺序
-
@Igor 感谢您的建议。按照你说的,我能把它保存下来。如果你愿意,请回复为答案,我会接受:)
-
@LittleNobody 请您出示或联系我,因为我正在寻找相同的答案,我在 SO 添加了一个问题。我正在使用交换来改变位置,但它没有保存到
SQLite。下面是我的问题。 stackoverflow.com/questions/54867970/…
标签: android android-recyclerview android-room