Сохранение смены сетки GridLayoutManager

У меня RecyclerView, по нажатию я могу поменять вид отображения компонентов, проблема в том что после того как я закрываю приложение и заново его открываю сетка забрасывается до изначальной, т.е. не сохраняется выбранная мной компоновка элементов, как сделать так что бы она сохранялась? Я догадываюсь что это можно сделать с помощью SharedPreferences, но я ещё не разобрался как это правильно сделать, помогите написать код.

Решил добавить GIF чтобы было наглядно видно о чём я говорю.

  1. Я нажимаю на "кнопку" справа сверху
  2. Компоновка элементов в RecyclerView меняется
  3. Закрываю приложение
  4. Открываю приложение
  5. Выбранная мной компоновка не сохранилась

введите сюда описание изображения

Теперь код

Fragment в котором находиться весь код

public class FragmentMenu extends Fragment implements OnCustomerListChangedListener, OnStartDragListener {

    public static FragmentMenu newInstance() {
        return new FragmentMenu();
    }

    public static ArrayList<ItemMenu> ItemMenuList;
    private AdapterMenu3 AdapterMenu3;
    private RecyclerView rv_menu;
    private RecyclerView.LayoutManager rlm_menu;

    private CardView cv_menu_settings, cv_menu_search, cv_switch;

    public static ItemTouchHelper mItemTouchHelper;

    public static SharedPreferences mSharedPreferences;
    public static SharedPreferences.Editor mEditor;
    public static String LIST_OF_SORTED_DATA_ID = "json_list_sorted_data_id";
    public static String PREFERENCE_FILE = "preference_file";

    private GridLayoutManager gridLayoutManager;

    public static List<Customer> mCustomers;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_menu, container, false);
    }

    private void setupViewPager(ViewPager viewPager) {
        PagerAdapter adapter = new PagerAdapter(getChildFragmentManager());
        adapter.addFragment(new FragmentTest(), "История");
        adapter.addFragment(new FragmentTest(), "Избраное");
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {

        cv_switch = requireView().findViewById(R.id.cv_switch);

        cv_switch.setOnClickListener(v -> {
            if (gridLayoutManager.getSpanCount() == SPAN_COUNT_ONE) {
                gridLayoutManager.setSpanCount(SPAN_COUNT_THREE);
            } else {
                gridLayoutManager.setSpanCount(SPAN_COUNT_ONE);
            }
        });

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

        TabLayout tabLayout = requireView().findViewById(R.id.tl_menu);
        ViewPager viewPager = requireView().findViewById(R.id.vp_menu);
        setupViewPager(viewPager);

        tabLayout.setupWithViewPager(viewPager);

        mSharedPreferences = requireActivity().getApplicationContext().getSharedPreferences(PREFERENCE_FILE, Context.MODE_PRIVATE);
        mEditor = mSharedPreferences.edit();

        rv_menu = requireView().findViewById(R.id.rv_menu);
        //RecyclerView1();

        RecyclerView2(rv_menu);

    }

    private void RecyclerView2(RecyclerView recyclerView) {

        gridLayoutManager = new GridLayoutManager(getContext(), SPAN_COUNT_ONE);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(mLayoutManager);
        mCustomers = getSampleData();

        AdapterMenu3 = new AdapterMenu3(mCustomers,
                (ClickTasks) getContext(),
                (ClickTraders) getContext(),
                (ClickKeys) getContext(),
                (ClickHandbook) getContext(),
                (ClickLocations) getContext(),
                (ClickRounds) getContext(),
                gridLayoutManager);
        recyclerView.setAdapter(AdapterMenu3);
        recyclerView.setLayoutManager(gridLayoutManager);
    }

    public static List<Customer> getSampleData() {
        List<Customer> customerList = SampleData.addSampleCustomers();
        List<Customer> sortedCustomers = new ArrayList<>();
        String jsonListOfSortedCustomerId = mSharedPreferences.getString(LIST_OF_SORTED_DATA_ID, "");

        if (!jsonListOfSortedCustomerId.isEmpty()) {

            Gson gson = new Gson();
            List<Long> listOfSortedCustomersId = gson.fromJson(jsonListOfSortedCustomerId, new TypeToken<List<Long>>() {
            }.getType());

            if (listOfSortedCustomersId != null && listOfSortedCustomersId.size() > 0) {
                for (Long id : listOfSortedCustomersId) {
                    for (Customer customer : customerList) {
                        if (customer.getId().equals(id)) {
                            sortedCustomers.add(customer);
                            customerList.remove(customer);
                            break;
                        }
                    }
                }
            }
            if (customerList.size() > 0) {
                sortedCustomers.addAll(customerList);
            }

            return sortedCustomers;
        } else {
            return customerList;
        }
    }
}

B Adapter к RecyclerView

public class AdapterMenu3 extends RecyclerView.Adapter<AdapterMenu3.MenuViewHolder> {

    public static final int SPAN_COUNT_ONE = 1;
    public static final int SPAN_COUNT_THREE = 3;

    private static final int VIEW_TYPE_SMALL = 1;
    private static final int VIEW_TYPE_BIG = 2;

    private final List<Customer> mCustomers;
    private GridLayoutManager gridLayoutManager;

    private final ClickTasks clickTasks;
    private final ClickTraders clickTraders;
    private final ClickKeys clickKeys;
    private final ClickHandbook clickHandbook;
    private final ClickLocations clickLocations;
    private final ClickRounds clickRounds;

    public AdapterMenu3(List<Customer> customers,
                        ClickTasks clickTasks, ClickTraders clickTraders, ClickKeys clickKeys,
                        ClickHandbook clickHandbook, ClickLocations clickLocations, ClickRounds clickRounds, GridLayoutManager gridLayoutManager) {
        mCustomers = customers;
        this.clickTasks = clickTasks;
        this.clickTraders = clickTraders;
        this.clickKeys = clickKeys;
        this.clickHandbook = clickHandbook;
        this.clickLocations = clickLocations;
        this.clickRounds = clickRounds;
        this.gridLayoutManager = gridLayoutManager;
    }

    @NonNull
    @Override
    public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == VIEW_TYPE_BIG) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_menu, parent, false);
        } else {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_menu_2, parent, false);
        }
        return new MenuViewHolder(view, viewType);
    }

    @Override
    public int getItemViewType(int position) {
        int spanCount = gridLayoutManager.getSpanCount();
        if (spanCount == SPAN_COUNT_ONE) {
            return VIEW_TYPE_BIG;
        } else {
            return VIEW_TYPE_SMALL;
        }
    }

    @Override
    public void onBindViewHolder(MenuViewHolder holder, int position) {

        final Customer selectedCustomer = mCustomers.get(position);

        holder.customerName.setText(selectedCustomer.getName());

        holder.iv_image.setImageResource(selectedCustomer.getImagePath());

        holder.cv_menu.setOnClickListener(v -> {
            if (selectedCustomer.getId() == 1) {
                clickTasks.ClickTasks();
            } else if (selectedCustomer.getId() == 2) {
                clickTraders.ClickTraders();
            } else if (selectedCustomer.getId() == 3) {
                clickHandbook.ClickHandbook();
            } else if (selectedCustomer.getId() == 4) {
                clickKeys.ClickKeys();
            } else if (selectedCustomer.getId() == 5) {
                clickLocations.ClickLocations();
            } else if (selectedCustomer.getId() == 6) {
                clickRounds.ClickRounds();
            }
        });
    }

    @Override
    public int getItemCount() {
        return mCustomers.size();
    }

    public static class MenuViewHolder  extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
        public final TextView customerName;
        public final ImageView handleView, iv_image;
        CardView cv_menu;

        public MenuViewHolder(@NonNull View itemView, int viewType) {
            super(itemView);

            if (viewType == VIEW_TYPE_BIG) {
                customerName = itemView.findViewById(R.id.tv_menu);
                handleView = itemView.findViewById(R.id.iv_drag);
                iv_image = itemView.findViewById(R.id.iv_image);
                cv_menu = itemView.findViewById(R.id.cv_menu);
            } else {
                customerName = itemView.findViewById(R.id.tv_menu);
                handleView = itemView.findViewById(R.id.iv_drag);
                iv_image = itemView.findViewById(R.id.iv_image);
                cv_menu = itemView.findViewById(R.id.cv_menu);
            }
        }

        @Override
        public void onItemSelected() {

        }

        @Override
        public void onItemClear() {

        }
    }
}

Теперь


Ответы (1 шт):

Автор решения: Vadik

У вас в коде уже есть mSharedPreferences, записать туда булевое значение можно так:

mSharedPreferences.edit().putBoolean("is_grid", true /* или false */).apply();

Чтобы прочитать значение:

boolean isGridLayout = mSharedPreferences.getBoolean("is_grid", false);
→ Ссылка