Сохранение смены сетки GridLayoutManager
У меня RecyclerView, по нажатию я могу поменять вид отображения компонентов, проблема в том что после того как я закрываю приложение и заново его открываю сетка забрасывается до изначальной, т.е. не сохраняется выбранная мной компоновка элементов, как сделать так что бы она сохранялась? Я догадываюсь что это можно сделать с помощью SharedPreferences, но я ещё не разобрался как это правильно сделать, помогите написать код.
Решил добавить GIF чтобы было наглядно видно о чём я говорю.
- Я нажимаю на "кнопку" справа сверху
- Компоновка элементов в
RecyclerViewменяется - Закрываю приложение
- Открываю приложение
- Выбранная мной компоновка не сохранилась
Теперь код
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 шт):
У вас в коде уже есть mSharedPreferences, записать туда булевое значение можно так:
mSharedPreferences.edit().putBoolean("is_grid", true /* или false */).apply();
Чтобы прочитать значение:
boolean isGridLayout = mSharedPreferences.getBoolean("is_grid", false);
