Quelle est la meilleure façon d'économiser de l'état de RecyclerView?

J'ai fragment contient recyclerview dans l'activité principale

Fragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle   savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view  = inflater.inflate(R.layout.activity_main, container, false);
    initInstances(view);
    setRetainInstance(true);
    return view;
}

private void initInstances(View view) {
    mRecyclerView = (RecyclerView) view.findViewById(R.id.dialogList);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    adapter = new MyAdapter(items);
    mRecyclerView.setAdapter(mAdapter);
}

MainActivity.java

dans la méthode onCreate:

myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG);
if (MyFragment == null) {
    MyFragment = new MyFragment();
    getSupportFragmentManager().beginTransaction().add(R.id.content_frame,
            myFragment, MyFragment.TAG).commit();
}

Mais lorsque l'orientation changé, mon RecyclerView redessiné.

J'ai essayé d'économiser de l'etat au remplacement onSaveInstanceState et onRestoreInstanceState comme ce Comment prévenir les vues personnalisées de perdre de l'etat à travers les changements d'orientation de l'écran ou La sauvegarde et la restauration de l'état d'affichage android, mais en vain, pour moi

Comment correctement enregistrer l'état de RecyclerView et de l'adaptateur d'éléments lorsque le changement d'orientation?

SOLUTION:
Mon fragment s'étend de BaseFragment avec certaines méthodes:

public class BaseFragment extends Fragment{
Bundle savedState;
public BaseFragment() {
super();
if (getArguments() == null)
setArguments(new Bundle());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!restoreStateFromArguments()) {
onFirstTimeLaunched();
}
}
protected void onFirstTimeLaunched() {
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveStateToArguments();
}
public void saveStateToArguments() {
if (getView() != null)
savedState = saveState();
if (savedState != null) {
Bundle b = getArguments();
b.putBundle("internalSavedViewState8954201239547", savedState);
}
}
private boolean restoreStateFromArguments() {
Bundle b = getArguments();
savedState = b.getBundle("internalSavedViewState8954201239547");
if (savedState != null) {
onRestoreState(savedState);
return true;
}
return false;
}
private Bundle saveState() {
Bundle state = new Bundle();
onSaveState(state);
return state;
}
protected void onRestoreState(Bundle savedInstanceState) {
}
protected void onSaveState(Bundle outState) {
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroyView() {
super.onDestroyView();
saveStateToArguments();
}

Dans mon fragment-je remplacer les méthodes et enregistrer l'état de mLayoutManager

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
protected void onSaveState(Bundle outState) {
super.onSaveState(outState);
outState.putParcelable("myState", mLayoutManager.onSaveInstanceState());
}
@Override
protected void onRestoreState(Bundle savedInstanceState) {
super.onRestoreState(savedInstanceState);
mLayoutManager.onRestoreInstanceState(savedInstanceState.getParcelable("myState"));
}
Le manque d'uniformité entre les modifications de configuration et le fragment backstack est un cauchemar absolu. Merci pour l'idée. Cela semble avoir résolu mes problèmes pour l'instant.

OriginalL'auteur olle | 2015-04-24