Подтвердить что ты не робот

Сохранение списка в списке фрагментов при изменении ориентации

У меня есть приложение, использующее фрагменты, все из которых содержатся в одном действии. Действие начинается с фрагмента, содержащего меню кнопок, из-за чего различные фрагменты списка заменяют исходный фрагмент кнопки/меню.

Моя проблема заключается в том, что при изменении ориентации, если активность отображает одно из списков, оно исчезает, и меню кнопки возвращается. Я понимаю, почему это происходит... активность уничтожается и воссоздается, но не как ее обойти и поддерживать просмотр/текущий фрагмент списка с помощью изменения ориентации.

Я нашел setRetainInstance и пример использования здесь, но я не могу понять, как применить его к моей ситуации с меню кнопок или возможностью того, что фрагмент, который я хочу сохранить, может быть одним из нескольких разных.

Ниже приведен код, упрощающий отображение основной активности и одного из списков.

Приветствуются любые указатели на то, что добавить, где сделать так, чтобы фрагмент списка был сохранен.

активность

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);        
    }
}
4b9b3361

Ответ 1

как работать с ним и поддерживать просмотр списка/текущий фрагмент с помощью изменения ориентации

Вы слепо заменяете фрагмент каждый раз, когда вызывается onCreate(). Вместо этого добавьте/замените фрагмент, если savedInstanceState() - null. Если это не null, вы возвращаетесь из конфигурации, и ваши существующие фрагменты будут воссозданы (или, если они были сохранены, они уже есть).

setRetainInstance(true) означает, что сам фрагмент будет сохранен через изменения конфигурации, вместо того, чтобы быть уничтожен/воссоздан, как и активность. Однако он все равно будет вызываться с помощью onCreateView(). В вашем коде это означает, что ваши члены данных ItemListFragment будут придерживаться, но вам все равно придется вызывать setListAdapter(), даже если вы не запрашиваете базу данных.

Ответ 2

Я знаю, что это было разрешено давным-давно, но ради людей, ищущих решение, у которого столько же проблем, сколько у меня (с повторением) с удержанием списков во время изменения ориентации, я хотел бы добавить что вы также можете использовать пользовательский класс, который содержит список данных для вашего списка.

Таким образом, он сохраняет данные при воссоздании активности (и listfragment), и вы можете просто проверить, есть ли у нее какие-либо данные в вашем oncreate. Если list == null или list.size < 0 вы выполняете как обычно и получаете данные, как обычно. В противном случае вы просто установите свой список с данными, которые у него уже есть.

Для меня это намного проще, и, увидев, что Eclipse автоматически создает подобный класс DummyContent для ваших данных при создании проекта управления потоком master/detail для Android, в основном требуется только изменение отображения вашего фрагмента списка.