我正在使用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();
}
答案 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();