即使在通过抽屉更改片段后,如何保留ListView的内容

时间:2014-09-25 11:03:48

标签: android sqlite listview android-fragments

我正在使用Android Studio,我创建了一个包含NavigationDrawerFragment的Activity。 其中一个片段是使用带有复杂项目的自定义ArrayAdapter在ListView中加载SQLite数据库的内容。

我的问题是,如果我在抽屉中选择另一个片段,然后再回到这个片段,则会再次调用片段的onCreate(),onCreateView()也是如此,并且数据库再次被加载。 / p>

如何在不加载数据库的情况下保留所有内容,也不必再次填充列表?

当方向发生变化时,我不会遇到这个问题,所以我有点困惑。也许是因为我有肖像和风景的布局?

这是onCreateView()

的代码
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    getActivity().getActionBar().show();
    View view = inflater.inflate(R.layout.fragment_papers, container, false);

        allItems = new ArrayList<ItemData>();

            getAllItemsFromDB("");


        mAdapter = new ItemsList(getActivity(), allItems, this, mDBApi);

        // Set the adapter

        mListView = (AbsListView) view.findViewById(R.id.list);

        mListView.setAdapter(mAdapter);


        // Set OnItemClickListener so we can be notified on item clicks
        mListView.setOnItemClickListener(this);
        mListView.setOnScrollListener(this);

    return view;
}

并且getAllItemsFromDB()包含类似

的内容
public void getAllItemsFromDB(String query){

Cursor c = sqldb.rawQuery("SELECT * FROM 'Table' " + query, null);

    while (c.moveToNext()) {

        allItems.add(parseSQL(sqldb, c));


    }

    c.close();

}

2 个答案:

答案 0 :(得分:1)

将数组列表设置为静态

private static List<ItemData> allItems;

然后将其检查为null并仅初始化一次

if(allItems == null) {
     allItems = new ArrayList<ItemData>();
     getAllItemsFromDB("");
}

答案 1 :(得分:0)

可能是每次加载frament为

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, new UrFragment()).commit();

不要这样做,创建片段实例并使用它。

    // update the main content by replacing fragments
    Fragment fragment = new UrFragment();
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();