При удалении представления с помощью прокрутки в RecyclerView не удаляется в SharedPreference - PullRequest
0 голосов
/ 06 сентября 2018

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

}

1 Ответ

0 голосов
/ 06 сентября 2018

Во-первых, вам, вероятно, не следует загружать список избранных из настроек каждый раз, когда вы хотите запросить или изменить список. Вместо этого, запросите его один раз, когда будет создано действие, к которому принадлежит RecyclerView (вы можете сделать это из самого адаптера или из действия), и сохраните его в глобальной переменной. то есть:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...