当前位置: 首页 > 知识库问答 >
问题:

Android:FragmentPagerAdapter不保存Fraank的状态?

缪修德
2023-03-14

我的碎片雷达有问题。

我不能保存片段的状态,然后在片段中有一个视图。每当我使用左右滑动时,都会通过覆盖扩展FragmentPagerAdapter的静态类中的getItem ( int position)方法来重新创建片段。

 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 中,每个片段实例都有几个步骤,这会导致数据库连接池饱和。

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

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

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

我还没有找到任何建议,非常感谢

共有2个答案

松波
2023-03-14

首先,每次调用<code>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不完全一样,这意味着它不使用空容器片段,然后用不同的数据重新填充它。

取而代之的是,它会在需要时创建一个新的片段。因此,您应该在创建片段时传递数据(如果有的话)。请研究Android文档中的示例。

在实时项目中,您可以传递< code >片段应该引用的条目的实际< code>ID,而不是将当前位置传递给新的< code >片段。

邓威
2023-03-14

对ViewPager对象使用setOffscreenPageLimit属性。

ViewPager pager = (ViewPager) findViewById(R.id.viewPagerId);
pager.setOffscreenPageLimit(2);
 类似资料:
  • 状态的保存与恢复 操作流程 为了状态的保存与恢复,我们可以先用栈上的一小段空间来把需要保存的全部通用寄存器和 CSR 寄存器保存在栈上,保存完之后在跳转到 Rust 编写的中断处理函数;而对于恢复,则直接把备份在栈上的内容写回寄存器。由于涉及到了寄存器级别的操作,我们需要用汇编来实现。 而对于如何保存在栈上,我们可以直接令 sp 栈寄存器直接减去相应需要开辟的大小,然后依次放在栈上。需要注意的是,

  • 在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔。如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只笔,要用哪只就选哪只。 在Canvas中也可以这样,不过Canvas中的画笔永远只有一只。所以,如果要更换画笔的颜色,就需要保存和恢复状态。状态其实就是画布当前属性的一个快照,包括: 图形的属性值,如strokeS

  • 问题内容: 是否有任何使用hibernate的公认的,行之有效的方式来保存实体在数据库中的更改历史? 我们需要跟踪相当多的对象,并且希望能够撤消对对象的更改。 我尝试使用hibernate模式的拦截器,但是对象的旧状态仅在执行时可用。大多数情况下我们还是这样做… 我目前正在让warp-persist和Guice一起管理会议。 问题答案: 我已经完成了一个拦截器(基于EmptyInterceptor

  • 问题 你需要保存正在运行线程的状态,这个状态对于其他的线程是不可见的。 解决方案 有时在多线程编程中,你需要只保存当前运行线程的状态。 要这么做,可使用 thread.local() 创建一个本地线程存储对象。 对这个对象的属性的保存和读取操作都只会对执行线程可见,而其他线程并不可见。 作为使用本地存储的一个有趣的实际例子, 考虑在8.3小节定义过的 LazyConnection 上下文管理器类。

  • 我的应用程序围绕一个HomeActivity,它在底部包含4个选项卡。这些选项卡中的每一个都是一个片段,所有的选项卡从一开始就被添加(而不是替换),并且在点击相应的选项卡时被隐藏/显示。 我的问题是,每当我更改tab时,我的卷轴的状态就会丢失。显示该问题的每个片段都使用(参见下面的示例)。 注意:由于某种原因,我的使用RecyclerView或ListView的片段保持了它们的滚动状态。 我读了几

  • 我想在下面的代码中通过SharedPreferences保存我的ToggleButton状态。请引导我。非常感谢。