El más correctamente para guardar el estado de RecyclerView?
Tengo fragmento contiene recyclerview en la actividad principal
Fragment.java
- ¿Debo cambiar el Listview existente en mi aplicación a RecyclerView?
- Recyclerview (Obtener elemento en Recyclerview)
- Firebase RecyclerVisualización infinita
- RecyclerView falta
- RecyclerView con fragmentos
@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")); }
- Problema de RecyclerView OnScrollListener ()
- Los fragmentos ViewPager hacen referencia al mismo RecyclerView y / o Adapter
- Firebase android ¿Cómo evitar que FirebaseRecyclerAdapter se actualice automáticamente?
- Problemas para conseguir que el video se reproduzca en Recyclerview
- Recyclerviews en ViewPager
- ¿Cómo agregar un simple encabezado 8dp / pie de página a RecyclerView de Android?
- Ocultar barra de desplazamiento de RecyclerView
- Uso de RecyclerView con tarjeta
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.
- ¿Existe una API para la nueva característica de Android Kitkat (4.4) de la función de identificación de llamadas?
- Cómo agregar una devolución de llamada de cierre de sesión para facebook sdk en android