Logcat показывает значение Parcelabe не нуль, но вызов LayoutManager # onRestoreInstanceState не перенаправляет в сохраненное состояние - PullRequest
0 голосов
/ 11 июня 2019

сохранение состояния RecyclerView в onPause () в GroceryFragment:

@Override
public void onPause() {
    super.onPause();
    Log.d(TAG, "onPause: called");
    FragmentStateListener fragmentStateListener = (FragmentStateListener) getActivity();
    fragmentStateListener.savingFragmentState(mCategoriesRV.getLayoutManager().onSaveInstanceState(), GROCERY_FRAGMENT);
    Log.d(TAG, "onPause: state - " + mCategoriesRV.getLayoutManager().onSaveInstanceState());
}

вот интерфейс FragmentStateListener:

public interface FragmentStateListener {

public void savingFragmentState(Parcelable parcelable, int fragmentInt);

}

этот интерфейс реализуется HomeActivity:

@Override
public void savingFragmentState(Parcelable parcelable, int fragmentInt) {
    Log.d(TAG, "savingFragmentState: parcelable = " + parcelable);
    Log.d(TAG, "savingFragmentState: fragmentInt = " + fragmentInt);
    switch (fragmentInt) {
        case HomeFragment.HOME_FRAGMENT:
            mHomeFragmentSavedState = parcelable;
            break;
        case GroceryFragment.GROCERY_FRAGMENT:
            mGroceryFragmentSavedState = parcelable;
            break;
    }
}

и поскольку GroceryFragment является вложенным фрагментом viewpager в BrowseFragment, поэтому сначала передайте это значение Parcelable в BrowseFragment, а оттуда в GroceryFragment:

 case R.id.browse_menu_item :
                                Log.d(TAG, "onNavigationItemSelected: browse icon clicked");

                                mBottomNavigationViewBNV.enableShiftingMode(1, false);
                                toggleChangeBottomNavigationItemIconsColor (1, 0, 2, 3, 4);
                                replaceFragment(BrowseFragment.newInstance(null, null, mGroceryFragmentSavedState), R.id.fragments_container_CL);
                                break;

...
fragmentList.add(GroceryFragment.newInstance(null, null, mGroceryFragmentSavedState));

вот метод newInstance в GroceryFragment:

 public static GroceryFragment newInstance(String param1, String param2, Parcelable savedState) {
    GroceryFragment fragment = new GroceryFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    args.putParcelable(RECYCLERVIEW_STATE, savedState);
    Log.d(TAG, "newInstance: savedstate = " + savedState);
    fragment.setArguments(args);
    return fragment;
}

onCreate () метод GroceryFragment:

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
        mSavedState = getArguments().getParcelable(RECYCLERVIEW_STATE);
    }
}

и, наконец, восстановление сохраненного состояния в LayoutManager в RecyclerView:

mCategoriesRV.setHasFixedSize(true);
        CategoriesRecyclerAdapter categoriesRecyclerAdapter =
                new CategoriesRecyclerAdapter(getFirestoreRecyclerOptions (), getActivity(), GroceryFragment.this, mCategoriesCL);
        mCategoriesRV.setAdapter(categoriesRecyclerAdapter);
    categoriesRecyclerAdapter.startListening();
    mCategoriesRV.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    if(mSavedState != null) {
        Log.d(TAG, "mCategoriesRVAction: mSavedState = " + mSavedState);
        mCategoriesRV.getLayoutManager().onRestoreInstanceState(mSavedState);
    }

снимок экрана Logcat для приведенного выше кода, где он четко показывает, что mSavedState не имеет значение null, но теперь он восстанавливает состояние:

enter image description here

...