18

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

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

我在这里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();    
    }
}

列表片段

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

2 回答 2

35

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

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

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

于 2012-05-05T16:20:55.923 回答
0

我知道这在很久以前就已经解决了,但是为了寻找解决方案的人,他们在方向改变期间(反复)遇到保留列表的问题,我想补充一点,你可以还可以使用一个自定义类来保存您的列表适配器的数据列表。

这样,它在重新创建活动(和列表片段)时保留数据,您可以测试它是否在您的 oncreate 中有任何数据。如果您像往常一样继续并以通常的方式获取数据list == nulllist.size < 0否则,您只需使用它已有的数据设置您的列表适配器。

To me this is a lot easier, and seeing as Eclipse automatically creates a similar DummyContent class for your data when creating an android master/detail flow project it basically only requires a change of the oncreate of your listfragment.

于 2014-04-29T13:20:11.327 回答