在屏幕方向改变时保留列表片段中的列表。

18
我有一个应用程序使用片段,所有片段都包含在一个活动中。该活动从包含按钮菜单的片段开始,这些按钮菜单会导致各种listfragments替换原始按钮/菜单片段。
我的问题是,在方向更改时,如果活动正在显示其中一个listviews,则它会消失,而按钮菜单会返回。我知道为什么会发生这种情况……活动被销毁并重新创建,但不知道如何解决它并通过方向更改维护列表视图/当前片段。
我发现了setRetainInstance和使用示例here,但我无法弄清楚如何将其应用于我的情况,无论是对于按钮菜单还是要保留的片段可能是几个不同的片段之一。
下面是简化后的代码,显示了主活动和一个listfragment。
非常感谢您提供在何处添加指针以使列表片段得到保留的任何建议。 活动
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个回答

35
如何在屏幕方向改变时维护列表视图/当前片段?您需要在每次调用onCreate()时仅在savedInstanceState()null时添加/替换片段,而不是盲目地替换片段。如果它不是null,则表示您正在从配置更改返回,并且现有的片段将被重建(或者如果它们被保留,则已经存在)。 setRetainInstance(true)表示片段本身将在配置更改期间保留,而不像活动一样被销毁/重新创建。但是,它仍将使用onCreateView()进行调用。在您的代码中,这意味着ItemListFragment的数据成员会保留,但即使您不重新查询数据库,仍需要调用setListAdapter()

好吧,那真是太尴尬了(更别提我多么愚蠢了)。我知道我应该检查savedInstanceState(),但出于某种原因这次我没去做,并且从来没有想过。感谢您的快速回复。 - Barak

0

我知道这个问题早就解决了,但是为了那些像我一样在屏幕方向改变时重复遇到保留列表的问题的人们,我想补充一下,你也可以使用一个自定义类来保存你的listadapter的数据列表。

这样,在重新创建活动(和列表片段)时它会保留数据,你只需要在oncreate中测试是否有任何数据。如果list == nulllist.size < 0,你可以按照通常的方式获取数据。否则,你只需使用已经存在的数据设置你的listadapter。

对我来说,这样做更容易,而且当你创建一个Android主/细节流项目时,Eclipse会自动为你的数据创建一个类似的DummyContent类,因此基本上只需要更改你的列表片段的oncreate方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接