我的FragmentPagerAdapter有问题。
我无法保存片段的状态,然后在片段中有视图。每当我使用左右滑动时,通过覆盖扩展FragmentPagerAdapter的静态类中的方法getItem(int position)来重新创建Fragment。
public static class GraphicsCollectionPagerAdapter extends FragmentPagerAdapter {
final int NUM_ITEMS = 3; // number of tabs
public GraphicsCollectionPagerAdapter(FragmentManager fm) {
super(fm);
fragmentList = new AnalyzeFragmentPageListWithDate();
fragment1 = new AnalyzeFragmentPage1();
fragment2 = new AnalyzeFragmentPage2();
}
@Override
public Fragment getItem(int position) {
//Log.i(TAG, "getItem() -> New fragment at position " + position);
switch (position) {
case 0:
return fragmentList;
case 1:
return fragment1;
case 2:
return fragment2;
}
return null;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Fragm1";
case 1:
return "Fragm2";
case 2:
return "Fragm3";
}
return "OBJECT " + (position + 1);
}
}
在片段的每个实例的OnCreateView方法中,SQLite数据库有几个步骤,这会导致数据库连接池的饱和。
每当动态更改片段时发现警告:“W / SQLiteConnectionPool(1111):数据库'/ data / data / com.myapp / databases / mydb'的SQLiteConnection对象被泄露!请修复您的应用程序以结束事务正确进行并关闭数据库不再需要时。“
我已经尝试使用FragmentStatePagerAdapter但没有成功。
请你告诉我怎么办?我不希望每次都重新生成Fragment,从而导致数据库出现问题。你有一个保存碎片/查看状态的例子吗?
我现在还没有找到任何建议。 非常感谢你
答案 0 :(得分:6)
为ViewPager对象使用setOffscreenPageLimit属性。
ViewPager pager = (ViewPager) findViewById(R.id.viewPagerId);
pager.setOffscreenPageLimit(2);
答案 1 :(得分:0)
首先,每次调用Fragment
时都会创建getItem()
的新实例
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentList();
case 1:
return new AnalyzeFragmentPage1();
case 2:
return new AnalyzeFragmentPage2();
}
return null;
}
请注意,FragmentPagerAdapter
与普通Adapter
完全不同,这意味着它不会使用空容器Fragment
,然后使用不同的数据重新填充它。
相反,它会在需要时创建新的Fragment
。因此,您应该在创建Fragment
时传递数据(如果有)。请研究Android文档中的example。
在实时项目中,您可以传递Fragment
应引用的条目的实际ID
,而不是将当前位置传递给新的Fragment
。