El más correctamente para guardar el estado de RecyclerView?

Tengo fragmento contiene recyclerview en la actividad principal

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

En el método onCreate:

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

Pero cuando la orientación cambió, mi RecyclerView rediseñado.

He intentado guardar el estado con sobreescribir onSaveInstanceState y onRestoreInstanceState como este Cómo evitar que las vistas personalizadas de perder el estado a través de los cambios de orientación de pantalla o Guardar y restaurar estado de vista android , pero no sirvió para mí

¿Cómo guardar correctamente el estado de RecyclerView y los elementos del adaptador cuando cambia la orientación?

SOLUCIÓN: Mi fragmento se extiende desde BaseFragment con algunos métodos:

 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(); } 

En mi fragmento omito los métodos y salvo el estado 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")); } 

Busqué cómo obtener la posición de desplazamiento del RecyclerView, pero no vi donde puedo recuperarla, así que creo que la mejor solución es manejar los cambios de rotación directamente en tu código java, e impedir que tu actividad se reinicie en el cambio de orientación.

Para evitar reiniciar el cambio de orientación, puede seguir esta solución .

Después de evitar que su actividad se reinicie, puede crear 2 archivos de formato xml, uno para el modo vertical y uno para el modo horizontal, agrega un FrameLayout en ambos archivos xml, manteniendo el lugar de su RecyclerView.

Cuando se llama al método onConfigurationChange (configuration newConfig), llama a setContentView (int layoutFile) con el LayoutFile apropiado siguiendo la nueva orientación, y agrega tu RecyclerView que estás reteniendo en un miembro de tu clase en FrameLayout.

  • Cómo agregar una vista dinámica entre los elementos de RecyclerView en android?
  • Vista de reciclador - cambia el tamaño de la vista de elemento mientras se desplaza (para efecto de carrusel)
  • RecyclerView horizontal con relleno inicial
  • ¿Hay una manera de compartir un mismo LayoutManager entre múltiples RecyclerViews anidados
  • Desplazamiento horizontal múltiple de RecyclerView
  • Android notifyItemRangeInserted deshabilitar autoscroll
  • RecyclerView con CollapsingToolbarLayout se desplaza mal cuando se lanza
  • ¿Cuál es la mejora de RecyclerView sobre ListView?
  • Configuración de la aplicación: layout_behavior mediante programación
  • RecyclerView con LinearLayoutManager con vista de encabezado que no recicla
  • AnimateLayoutChanges no funciona con RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.