studio navegar fragments entre dinamicos android android-listview android-fragments android-orientation

navegar - fragments dinamicos android studio



RetenciĆ³n de la lista en el fragmento de la lista en el cambio de orientaciĆ³n (2)

Tengo una aplicación que utiliza fragmentos, todos los cuales están contenidos en una sola actividad. La actividad comienza con un fragmento que contiene un menú de botones, todos los cuales hacen que varios fragmentos de lista reemplacen el fragmento original del botón / menú.

Mi problema es que tras un cambio de orientación, si la actividad muestra una de las vistas de lista, desaparece y vuelve el menú de botones. Entiendo por qué sucede esto ... la actividad se destruye y se vuelve a crear, pero no cómo evitarla y mantener la vista de lista / el fragmento actual a través del cambio de orientación.

He encontrado setRetainInstance y el ejemplo de uso here , pero no puedo entender cómo aplicarlo a mi situación con el menú de botones o la posibilidad de que el fragmento que quiero conservar pueda ser uno de varios.

A continuación se muestra un código simplificado para mostrar la actividad principal y uno de los fragmentos de lista.

Cualquier indicador sobre qué agregar en dónde hacerlo para que el fragmento de la lista se retenga será muy apreciado.

Actividad

public class Main extends FragmentActivity { private MainMenuFragment menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); menu = new MainMenuFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit(); } }

ListFragment

public class ItemListFragment extends ListFragment { private TextView header; private TextView empty; private Button add; public static Cursor itemCursor; private GroceryDB mDbHelper; public static long mRowId; public static CheckCursorAdapter lists; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.common_list, container, false); header = (TextView) v.findViewById(R.id.header); empty = (TextView) v.findViewById(android.R.id.empty); header.setText(R.string.header_item); empty.setText(R.string.empty_items); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mRowId=0; mDbHelper = new GroceryDB(getActivity()); mDbHelper.open(); itemCursor = mDbHelper.fetchAllItems(); getActivity().startManagingCursor(itemCursor); String[] from = new String[] { GroceryDB.ITEM_NAME }; int[] to = new int[] { R.id.ListItem }; lists = new CheckCursorAdapter(getActivity(), R.layout.listlayout_itemlist, itemCursor, from, to); setListAdapter(lists); } }


cómo solucionarlo y mantener la vista de lista / el fragmento actual a través del cambio de orientación

Usted está reemplazando ciegamente el fragmento cada vez que se llama onCreate() . En cambio, solo agrega / reemplaza el fragmento si savedInstanceState() es null . Si no es null , regresará de un cambio de configuración y sus fragmentos existentes se volverán a crear (o, si se retuvieron, ya están allí).

setRetainInstance(true) significa que el fragmento en se setRetainInstance(true) través de los cambios de configuración, en lugar de ser destruido / recreado como lo es la actividad. Sin embargo, todavía se llamará con onCreateView() . En su código, eso significa que sus miembros de datos de ItemListFragment mantendrían, pero aún tendría que llamar a setListAdapter() incluso si no vuelve a consultar la base de datos.


Sé que esto se resolvió hace mucho tiempo, pero por el bien de las personas que buscan una solución que tenga tantos problemas como (repetidamente) he tenido con la retención de listas durante un cambio de orientación, me gustaría agregar que podría También use una clase personalizada que contenga la lista de datos para su listadapter.

De esta manera, conserva los datos al recrear la actividad (y el fragmento de lista) y puede probarlos para ver si hay algún dato en su creación. Si la list == null o el list.size < 0 , proceda de la forma habitual y obtenga los datos de la forma en que normalmente los obtiene. De lo contrario, simplemente configura el adaptador de lista con los datos que ya tiene.

Para mí esto es mucho más fácil, y al ver que Eclipse crea automáticamente una clase DummyContent similar para sus datos cuando crea un proyecto de flujo maestro / detalle de Android, básicamente solo se requiere un cambio en la creación de un fragmento de lista.