首页 > 解决方案 > 当在 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();
    }

}

标签: androidandroid-recyclerviewsharedpreferences

解决方案


一方面,您可能不应该在每次想要查询或修改列表时都从首选项中加载收藏夹列表。相反,在创建此 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 并让它手动比较值,因此甚至可以匹配不同的实例。


推荐阅读