在方向更改中保留列表片段中的列表

Bar*_*rak 18 android android-listview android-fragments android-orientation

我有一个使用片段的应用程序,所有这些片段都包含在一个活动中.活动以包含按钮菜单的片段开始,所有这些按钮都会导致各种listfragments替换原始按钮/菜单片段.

我的问题是,在方向更改时,如果活动正在显示其中一个列表视图,它将消失并返回按钮菜单.我理解为什么会发生这种情况......活动被破坏并重新创建,但不是如何解决它并通过方向更改维护列表视图/当前片段.

我已经找到setRetainInstance这里使用的例子,但我无法弄清楚如何将它应用于我的情况下使用按钮菜单或者我想要保留的片段可能是几个不同的片段之一.

下面是简化的代码,用于显示主要活动和其中一个listfragments.

任何指向添加内容的指针都将非常感激,以便保留列表片段.

活动

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();    
    }
}
Run Code Online (Sandbox Code Playgroud)

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);        
    }
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 35

如何解决它并通过方向更改维护列表视图/当前片段

你每次onCreate()调用时都会盲目地替换片段.相反,只有添加/如果更换片段savedInstanceState()null.如果不是null,您将从配置更改中返回,并且将重新创建现有片段(或者,如果它们被保留,则它们已经存在).

setRetainInstance(true)意味着片段本身将在配置更改中保留,而不是像活动那样被销毁/重新创建.但是,它仍将被调用onCreateView().在您的代码中,这意味着您的数据成员ItemListFragment会坚持下去,但setListAdapter()即使您不重新查询数据库,仍然需要调用.