【问题标题】:When Deleting View with Swipe in RecyclerView doesn't deletin in SharedPreference当在 RecyclerView 中通过滑动删除视图时不会在 SharedPreference 中删除
【发布时间】:2019-02-11 21:44:09
【问题描述】:

我正在尝试删除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();
    }

}

【问题讨论】:

    标签: android android-recyclerview sharedpreferences


    【解决方案1】:

    首先,您可能不应该在每次想要查询或修改列表时都从首选项中加载收藏列表。相反,在创建此 RecyclerView 所属的 Activity 时查询一次(您可以从 Adapter 本身或从 Activity 执行此操作),并将其存储到全局变量中。即:

    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);
    }
    

    您可能需要修改它以适应您的代码,但这是一个示例。


    您当前所拥有的将无法使用,因为每次您修改列表时,您都是从字符串表示中重新创建它。这意味着您加载的收藏夹列表包含完全不同的模型实例,即使它们包含相同的值。

    当您将 OrderModel 传递给您的 removeFavorite() 方法时,它不会删除任何东西,因为没有什么是平等的;通过重新加载列表,您将拥有全新的实例。

    如果您真的想保留当前的代码结构,请切换到索引而不是传递对象。或者,覆盖 OrderModel 中的 equals() 并让它手动比较值,因此甚至可以匹配不同的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2017-08-05
      • 2019-09-22
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多