android - 当在 RecyclerView 中通过滑动删除视图时不会在 SharedPreference 中删除
问题描述
我正在尝试使用刷入删除视图,我使用收藏按钮RecylerView
保存到选定的视图中。SharedPreferences
在我保存到选定的视图后SharedPreferences
,我正在尝试Activity
通过向左滑动来删除收藏夹,我已经这样做了,但是当我返回收藏夹时,当我向左滑动时Activity
,我看到旧项目没有更新SharedPreferences
。
我怎样才能做到这一点?
public class SharedPreference {
public static final String PREFS_NAME = "NKDROID_APP";
public static final String FAVORITES = "Favorite";
public SharedPreference() {
super();
}
public void storeFavorites(Context context, List<OrderModel> favorites) {
SharedPreferences settings;
SharedPreferences.Editor editor;
settings = context.getSharedPreferences(PREFS_NAME,
Context.MODE_PRIVATE);
editor = settings.edit();
Gson gson = new Gson();
String jsonFavorites = gson.toJson(favorites);
editor.putString(FAVORITES, jsonFavorites);
editor.commit();
}
public ArrayList<OrderModel> loadFavorites(Context context) {
SharedPreferences settings;
List<OrderModel> favorites;
settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
if (settings.contains(FAVORITES)) {
String jsonFavorites = settings.getString(FAVORITES, null);
Gson gson = new Gson();
OrderModel[] favoriteItems = gson.fromJson(jsonFavorites,OrderModel[].class);
favorites = Arrays.asList(favoriteItems);
favorites = new ArrayList<OrderModel>(favorites);
} else
return null;
return (ArrayList<OrderModel>) favorites;
}
public void addFavorite(Context context, OrderModel beanSampleList) {
List<OrderModel> favorites = loadFavorites(context);
if (favorites == null)
favorites = new ArrayList<OrderModel>();
favorites.add(beanSampleList);
storeFavorites(context, favorites);
}
public void removeFavorite(Context context, OrderModel beanSampleList) {
ArrayList<OrderModel> favorites = loadFavorites(context);
if (favorites != null) {
favorites.remove(beanSampleList);
storeFavorites(context, favorites);
}
}
/*
public void saveHighScoreList(String scoreString) {
editor.putString(FAVORITES, scoreString);
editor.commit();
}
public String getHighScoreList() {
return settings.getString(FAVORITES, "");
}
*/
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
if (viewHolder instanceof OrderAdapter.OrderViewHolder) {
// get the removed item name to display it in snack bar
String name = order_models.get(viewHolder.getAdapterPosition()).getOrder_name();
final OrderModel deletedItem = order_models.get(viewHolder.getAdapterPosition());
final int deletedIndex = viewHolder.getAdapterPosition();
order_adapter.removeItem(viewHolder.getAdapterPosition());
//remove from shared preferences
sharedPreference.removeFavorite(Orders.this, deletedItem);
order_models.remove(deletedItem);
order_adapter.notifyDataSetChanged();
Toast.makeText(Orders.this, "Success Remove",Toast.LENGTH_SHORT).show();
// showing snack bar with Undo option
Snackbar snackbar = Snackbar
.make(constraint, name + " removed from cart!", Snackbar.LENGTH_LONG);
snackbar.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View view) {
// undo is selected, restore the deleted item
order_adapter.restoreItem(deletedItem, deletedIndex);
}
});
snackbar.setActionTextColor(Color.YELLOW);
snackbar.show();
}
}
解决方案
一方面,您可能不应该在每次想要查询或修改列表时都从首选项中加载收藏夹列表。相反,在创建此 RecyclerView 所属的 Activity 时查询一次(您可以从 Adapter 本身或从 Activity 执行此操作),并将其存储到全局变量中。IE:
class SomeActivity extends Activity {
private ArrayList<OrderModel> favorites = new ArrayList<>();
private SharedPreference prefsHelper = new SharedPreference();
@Override
public void onCreate(Bundle savedInstanceState) {
//....
favorites.addAll(prefsHelper.loadFavorites(this));
}
}
然后,当您想更改某些内容时,修改该 ArrayList 然后直接保存:
public void addFavorite(OrderModel model) {
favorites.add(model);
prefsHelper.storeFavorites(this, favorites);
}
您可能需要修改它以适合您的代码,但这是一个示例。
您当前所拥有的将不起作用,因为每次您修改列表时,您都是从 String 表示重新创建它。这意味着您加载的收藏夹列表包含完全不同的模型实例,即使它们包含相同的值。
当您将 OrderModel 传递给您的removeFavorite()
方法时,它不会删除任何东西,因为没有什么是平等的;通过重新加载列表,您将拥有全新的实例。
如果您真的想保留当前的代码结构,请切换到索引而不是传递对象。或者,覆盖equals()
OrderModel 并让它手动比较值,因此甚至可以匹配不同的实例。
推荐阅读
- android - 我可以在底部导航视图中添加超过 5 个菜单项吗?
- c# - 如何在执行下一个代码之前等待线程完成?
- python - 如何通过一次查询获取数据
- python - 在 IIS 上使用 django 错误 500 创建 python 文件时
- java - 读取 xml (windows-1252) 文件时出错
- php - 动态拖放表格行
- c++ - 我在微控制器 stm32f373 发现中点亮 LED 时遇到问题
- libgdx - 在制作软体(球体)并在 libgdx 中平移时,很少有网格顶点粘在原点上?
- install4j - 第二次启动时的执行级别启动应用程序不会从代码中调用 main 方法
- azure - 部署时的数据库参考