Android:FragmentPagerAdapter不保存Fragment的状态?

时间:2014-03-28 09:55:22

标签: java android android-fragments android-sqlite fragmentpageradapter

我的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,从而导致数据库出现问题。你有一个保存碎片/查看状态的例子吗?

我现在还没有找到任何建议。 非常感谢你

2 个答案:

答案 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