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

时间:2012-05-05 16:02:58

标签: android android-listview android-fragments android-orientation

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

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

我找到setRetainInstance以及使用here的示例,但我无法弄清楚如何将其应用于我的情况,使用按钮菜单或我想要的片段的可能性保留可能是几个不同的之一。

下面是简化的代码,用于显示主要活动和其中一个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);        
    }
}

2 个答案:

答案 0 :(得分:35)

  

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

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

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

答案 1 :(得分:0)

我知道很久以前就已经解决了这个问题,但是为了寻找一个解决方案的人,我希望在方向改变期间有多少问题(我反复)有保留名单另外,您还可以使用自定义类来保存listadapter的数据列表。

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

对我而言,这更容易,并且看到Eclipse在创建android主/详细信息流项目时自动为您的数据创建类似的DummyContent类,它基本上只需要更改listfragment的oncreate。