【问题标题】:Android : FragmentPagerAdapter don't saved the state of Fragment?Android:FragmentPagerAdapter 不保存 Fragment 的状态?
【发布时间】:2014-03-28 09:55:22
【问题描述】:

我的 FragmentPagerAdapter 有问题。

我无法保存 Fragment 的状态,然后在 Fragment 中有视图。每当我使用左右滑动时,都会通过覆盖扩展 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);
    }


}

在 Fragment 的每个实例的 OnCreateView 方法中,SQLite 数据库都有几个步骤,这会导致数据库连接池饱和。

每当动态更改片段时发现的警告是:“W / SQLiteConnectionPool (1111):数据库'/data/data/com.myapp/databases/mydb'的 SQLiteConnection 对象已泄露!请修复您的应用程序以结束事务进度正常并在不再需要时关闭数据库。”

我已经尝试使用 FragmentStatePagerAdapter,但没有成功。

您能告诉我如何进行吗?我不希望每次都重新生成 Fragment,从而导致数据库出现问题。你有保存片段/查看状态的例子吗?

我暂时没有找到任何建议。 非常感谢

【问题讨论】:

  • 片段中有列表视图吗?
  • 我有列表视图和条形图。谢谢
  • 我遇到了类似的问题,第一个片段中的列表视图在来自第三个片段后重新加载。我所做的是,我用 listFragment 替换片段并使用 SimpleCursorAdapter 和 LoaderManager.LoaderCallbacks 来填充列表视图
  • 你能给我一个这个修复的例子吗?谢谢
  • 这是一个很好的链接androiddesignpatterns.com/2012/07/…

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


【解决方案1】:

为您的 ViewPager 对象使用 setOffscreenPageLimit 属性。

ViewPager pager = (ViewPager) findViewById(R.id.viewPagerId);
pager.setOffscreenPageLimit(2);

【讨论】:

    【解决方案2】:

    首先在每次调用getItem() 时创建一个Fragment 的新实例

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多