Liste im Listenfragment bei Orientierungsänderung beibehalten
Ich habe eine app durch die Verwendung von Fragmenten, die alle enthalten in einer einzelnen Aktivität. Die Aktivität beginnt mit einem fragment enthält ein Menü von Schaltflächen, die alle dazu führen, verschiedene listfragments zu ersetzen die ursprüngliche Taste/Menü-fragment.
Mein problem ist, dass nach einer Ausrichtung zu ändern, wenn die Aktivität ist die Anzeige des listviews, es geht Weg, und der Taste Menü zurück. Ich verstehe, warum dies geschieht... die Aktivität wird zerstört und neu erstellt, aber nicht, wie das zu umgehen und pflegen der Liste Ansicht/aktuelle fragment durch die änderung der Ausrichtung.
Habe ich gefunden setRetainInstance
und das Beispiel verwenden hieraber ich kann nicht herausfinden, wie man es anwenden, um meine situation mit der Taste menu oder die Möglichkeit, dass das fragment will ich behalten, könnte eine von mehreren verschiedenen.
Unten ist der code, vereinfacht zu zeigen, die wichtigsten Aktivität und eines der listfragments.
Irgendwelche Hinweise, in was hinzufügen, wo es so machen, dass die Liste fragment wird beibehalten würde sehr geschätzt werden.
Aktivität
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);
}
}
InformationsquelleAutor der Frage Barak | 2012-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie blind dem Austausch der fragment-jeder Zeit
onCreate()
genannt wird. Stattdessen nur das hinzufügen/ersetzen Sie das fragment, wennsavedInstanceState()
istnull
. Wenn es nichtnull
Sie sind auf dem Rückweg von einer Konfiguration zu ändern, und Sie Ihre vorhandenen Fragmente neu erstellt werden (oder, wenn Sie erhalten bleiben, Sie sind schon da).setRetainInstance(true)
bedeutet, dass das fragment sich beibehalten werden über Konfigurations-änderungen, statt vernichtet zu werden/neu wie die Aktivität ist. Es ist jedoch immer noch aufgerufen werden, mitonCreateView()
. In Ihrem code, dass bedeutet, dass Ihre Daten MitgliederItemListFragment
würde bleiben, um, aber Sie würden noch anrufen müssensetListAdapter()
auch wenn Sie nicht erneute Abfrage der Datenbank.InformationsquelleAutor der Antwort CommonsWare
Weiß ich, dass dies gelöst wurde, vor langer Zeit, aber zum Wohle der Menschen auf der Suche nach einer Lösung, die haben so viel Probleme wie ich habe (mehrfach) hatte mit der Beibehaltung Listen während eine Orientierung ändern, ich möchte hinzufügen, dass Sie können auch eine benutzerdefinierte Klasse, die enthält die Liste der Daten, die für Ihre listadapter.
Diese Weise hält die Daten bei der Wiederherstellung der Aktivität (und listfragment) und Sie können einfach testen, um zu sehen, ob Sie alle Daten in Ihrer oncreate. Wenn die
list == null
oder dielist.size < 0
Sie wie gewohnt Fort und erhalten die Daten, wie auch immer Sie normalerweise bekommen. Ansonsten ist Sie nur auf dem listadapter mit den Daten, die er bereits hat.Mir das ist viel einfacher, und zu sehen, wie Eclipse erstellt automatisch eine ähnliche DummyContent Klasse für Ihre Daten beim erstellen eines android-master/detail flow-Projekt-es grundsätzlich erfordert nur eine änderung der oncreate Ihrer listfragment.
InformationsquelleAutor der Antwort SvenT23