При удалении представления с помощью прокрутки в RecyclerView не удаляется в SharedPreference

Я пытаюсь удалить просмотр с помощью прокрутки в RecylerView, я сохранил в SharedPreferences для выбранного просмотра с помощью избранной кнопки. После того, как я сохранил выбранный просмотр в SharedPreferences, я пытаюсь удалить Favorite Activity, проведя пальцем влево, я сделал это, но когда я вернулся в Favorite 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();
    }

}
0
0
292
1

Ответы 1

Во-первых, вам, вероятно, не следует загружать список избранного из предпочтений каждый раз, когда вы хотите запросить или изменить список. Вместо этого запросите его один раз, когда создается Activity, которому принадлежит этот RecyclerView (вы можете сделать это из самого адаптера или из 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(), он ничего не удаляет, потому что нет ничего равного; перезагрузив список, вы получите полностью свежие экземпляры.

Если вы действительно хотите сохранить текущую структуру кода, переключитесь на индексы вместо передачи объекта. Или переопределите equals() в OrderModel и попросите его вручную сравнить значения, чтобы можно было сопоставить даже разные экземпляры.

Другие вопросы по теме