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

Android 更改方向时在列表片段中保留列表,android,android-listview,android-fragments,android-orientation,Android,Android Listview,Android Fragments,Android Orientation,我有一个使用片段的应用程序,所有片段都包含在一个活动中。该活动从一个包含按钮菜单的片段开始,所有这些都会导致各种listfragments替换原始按钮/菜单片段 我的问题是,在方向发生变化时,如果活动正在显示一个列表视图,它将消失,按钮菜单将返回。我明白为什么会这样。。。活动被销毁并重新创建,但不包括如何通过方向更改来解决它和维护列表视图/当前片段 我已经找到了setRetainInstance和使用示例,但我不知道如何使用按钮菜单将其应用于我的情况,或者我想要保留的片段可能是几个不同片段中的一

我有一个使用片段的应用程序,所有片段都包含在一个活动中。该活动从一个包含按钮菜单的片段开始,所有这些都会导致各种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();    
    }
}
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);        
    }
}
如何绕过它并通过方向更改来维护列表视图/当前片段

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


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

我知道这一问题很久以前就已经解决了,但这是为了寻找和我一样有问题的解决方案的人(重复)在方向更改期间保留列表,我想补充一点,您也可以使用一个自定义类来保存listadapter的数据列表

这样,它在重新创建活动(和listfragment)时保留数据您只需测试一下oncreate中是否有任何数据。如果
list==null
list.size<0
您可以像往常一样获取数据,无论您以何种方式获取数据。否则,您只需使用它已有的数据设置listadapter


对我来说,这要容易得多,而且当创建android主/细节流项目时,Eclipse会自动为您的数据创建一个类似的DummContent类,基本上只需要更改listfragment的一次创建即可。

好吧,这让人非常尴尬(更不用说我了).我知道我应该检查savedInstanceState(),但由于某些原因,我这次没有做,甚至从未想过。谢谢您的快速回复。