片段已在 viewpager 中添加了 IllegalStateException

2024-01-02

我正在使用 viewpager 来显示图片。我基本上只需要三个片段:上一个要预览的图像、当前显示的图像和下一个要预览的图像。我想只显示上一张和下一张图像的预览,当用户实际滑动到它时,它将更改为完整图像。所以我想只使用 3 个片段来实现这一点。代码如下:

    private class ImagePagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener {
    private ImageFragment mImageFragment;
    private ImagePreviewFragment mPreviousPreviewFragment;
    private ImagePreviewFragment mNextPreviewFragment;

    public ImagePagerAdapter(FragmentManager fm, ImageFragment image, ImagePreviewFragment previous, ImagePreviewFragment next) {
        super(fm);
        mImageFragment = image;
        mPreviousPreviewFragment = previous;
        mNextPreviewFragment = next;
    }

    @Override
    public Fragment getItem(int position) {
        if (position == mPager.getCurrentItem()) {
            mImageFragment.display(position);
            return mImageFragment;
        }

        if (position < mPager.getCurrentItem()) {
            mPreviousPreviewFragment.display(position - 1);
            return mPreviousPreviewFragment;
        }
        mNextPreviewFragment.display(position + 1);
        return mNextPreviewFragment;
    }


    @Override
    public int getCount() {
        return 100;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.d(TAG, "onPageScrolled");
    }

    @Override
    public void onPageSelected(final int position) {
        Log.d(TAG, "onPageSelected " + position);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                notifyDataSetChanged();
            }
        }, 500);
    }


    @Override
    public void onPageScrollStateChanged(int state) {
        Log.d(TAG, "onPageScrollStateChanged " + state);
    }

    @Override
    public int getItemPosition(Object item) {
        return POSITION_NONE;
        //return POSITION_UNCHANGED;
    }
}

所以基本上,我预先创建了三个片段来显示上一个/下一个预览和当前图像,并将它们返回给 getItem()。我还在 onpageselected() 中通知datasetchange(),以使所有三个位置在用户滑动到新页面时更新片段。

但问题是它会抛出

    Fragment already added IllegalStateException

当第二次添加片段时。我认为这是因为之前已经添加了。我每次都可以创建一个新片段,但我认为这很浪费。那么我如何重用已经创建的片段并更新它们呢?

谢谢, 西蒙


FragmentStatePagerAdapter设计建议创造一个新的Fragment对于每个页面(看谷歌的例子 http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html)。不幸的是你无法阅读Fragment一旦它被添加到FragmentManager(适配器内部隐式发生的事情),因此你得到了异常。所以谷歌官方的方式是创建新的片段并让它们被适配器销毁并重新创建。

但是,如果您想重用页面并利用类似的 ViewHolder 模式,您应该坚持使用视图而不是片段。与片段不同,视图可以从其父级中删除并重新使用。延长PagerAdapter并实施instantiateItem()像这样:

@Override
public Object instantiateItem(ViewGroup container, final int position) {
    //determine the view type by position
    View view = viewPager.findViewWithTag("your_view_type");
    if (view == null) {
        Context context = container.getContext();
        view = LayoutInflater.from(context).inflate(R.layout.page, null);
        view.setTag("your_view_type");
    } else {
        ViewGroup parent = (ViewGroup) item.getParent();
        if (parent != null) {
            parent.removeView(item);
        }
    }
    processYourView(position, view);
    container.addView(view, MATCH);
    return view;
}

您应该添加一些额外的逻辑来按位置确定视图类型(因为您有 3 种类型的视图),我认为您可以弄清楚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

片段已在 viewpager 中添加了 IllegalStateException 的相关文章

  • OpenAI Gymnasium,有没有算法支持的库?

    OpenAI 发布了一个名为 Gymnasium 的新库 它应该取代 Gym 库 有许多库都实现了支持健身房环境的强化学习算法 但是 Gymnasium 的界面略有变化 有没有支持 Gymnasium 的算法库 我尝试了 CleanRL K
  • 为什么没有参数的函数(与实际函数定义相比)可以编译?

    我刚刚看到某人的 C 代码 我很困惑为什么要编译它 有两点我不明白 The 函数原型与实际函数定义相比没有参数 中的参数函数定义没有类型 include
  • iOS HTTP 请求在后台运行

    当应用程序处于后台时 可以向 PHP 服务器发出 HTTP 异步请求吗 该应用程序是基于位置的应用程序 应收集当前位置并每 5 或其他值 分钟将坐标发送到服务器 即使应用程序处于后台 我也可以将 http 帖子发送到服务器吗 我读到了很多关
  • Thymeleaf Spring 安全集成 sec:授权不起作用

    我正在使用带有 Spring security 的 Thymeleaf 模板引擎 我还使用 Thymeleaf Spring Security 集成模块来使用 sec authorize 功能 但由于某种原因它不起作用 我没有收到任何错误
  • 类型铸造自我

    以下自我转换对 ClassA 有何作用 这种种姓可以让你进入ClassA吗 A h类 interface ClassA NSObject NSUInteger someNumber ClassB classB property nonato
  • 用于高级搜索/过滤的.Net Web API URL 约定

    我对 Microsoft 的 REST 和 WebAPI 比较陌生 我们正在实现一个中心 REST 服务 它将容纳多种类型的对象获取和设置 作为该项目的领导者 我的任务是提出我们正在使用的正确的 Uri 设计 我想知道关于战争什么想法更好
  • 你遇到过哪些 git 陷阱?

    我遇到的最糟糕的情况是 git 子模块 我在 github 上有一个项目的子模块 该项目无人维护 我想提交补丁 但无法提交 所以我分叉了 现在子模块指向原始库 而我需要它指向 fork 因此 我删除了旧的子模块 并将其替换为同一提交中新项目
  • 将文件附加到 PHPMailer

    我目前正在开发一个项目 该项目将文件作为 blob 存储在数据库中 我需要将文件附加到电子邮件并通过 PHPMailer 发送出去 我熟悉 mail gt addAttachment 但是 这个函数似乎只接受文件路径 而我没有 我想知道是否
  • 使用Python的timeit获取“全局名称'foo'未定义”

    我想知道执行一条Python语句需要多少时间 所以我上网查了一下 发现标准库提供了一个名为timeit http docs python org library timeit html旨在做到这一点 import timeit def fo
  • 重构后如何保留 terraform 资源以使用 for_each?

    目前我正在对我们的基础设施进行小型重构 我的项目的当前版本类似于以下内容 我正在尝试使用 for each 来重用变量 resource google cloud scheduler job job name Create All Doss
  • 获取css规则、chrome扩展

    我正在开发 Chrome 扩展程序 它需要访问document styleSheets cssRules 它在某些网站上运行良好 例如w3school 但其他人则不然 比如堆栈溢出 我收到错误 Failed to read the cssR
  • 获取长度为 n 的所有(n-选择-k)组合

    我怎样才能获得长度的所有组合 按顺序 n从数字列表中 例如 给定列表 1 2 3 4 并设置n 3 我怎样才能得到这些结果 1 2 3 1 2 4 1 3 4 2 3 4 For combinations of all possible l
  • 不确定如何在使用故事板时正确子类化 UIApplication

    我想在 X 次用户不活动 没有触发触摸事件 后返回故事板的初始视图控制器 经过一些研究 我发现检测不活动的最常见方法是触发 NSTimer 并在事件触发时重置间隔 为了检测触发的事件 我们在 UIApplication 的子类中重写 UIA
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理
  • 如何在 iOS 11 上的 Swift 中获取 FLAC 文件元数据?

    我需要获取 FLAC 文件的元数据 我尝试了以下代码 let item AVPlayerItem url URL fileURLWithPath path let commonMetadata item asset commonMetada
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • 将笔记本生成的 HTML 片段转换为 LaTeX 和 PDF

    在我的笔记本里有时会有 from IPython display import display HTML display HTML h3 The s is important h3 question of the day 但当我后来将笔记本
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐

  • 使用 DataFrame.lookup 获取列名称是字符串子集的行

    假设有一个如下所示的简单数据框 data grades Feb 10 20 30 40 50 grades Jan 5 10 15 20 25 grades April 1 2 3 4 5 months Feb April Jan Feb
  • 如何使用具有深度限制的 jQuery find() ?

    我需要使用 jquery 的 find 选择器来获取所有具有 field container 类的 div 问题是我无法深入 DOM 树 这是我的简化 HTML 结构 div div div class field container sp
  • JTable 中的多行选择

    我有一个 JTable 其中一列是不可编辑的文本 第二列是一个显示布尔值的复选框 现在我想要的是 当用户选择多行并取消选中其中任何一行时选中复选框 则选择下的所有复选框都应取消选中 反之亦然 使用 Hovercraft 的示例和 camic
  • 简单插入适用于 phpmyadmin 但不适用于 php

    我正在尝试使用 mysql query 插入此查询 INSERT INTO um group rights um group id cms usecase id um right id VALUES 2 1 1 INSERT INTO um
  • MySQL / MariaDB:如何查找基于时间的数据的差距?

    记录器系统每 5 秒保存一行数据 秒 0 5 10 15 55 时间类似于23 00 07不可能 有时 记录器由于通信错误而无法保存 并且表中只是缺少行 我需要检测这些间隙 我想读取间隙之前的最后一行和间隙之后的第一行 这些是演示数据 cr
  • 来自升序序列的连续子列表

    given xs 1 2 3 4 6 7 9 10 11 我的目标是回来 1 2 3 4 6 7 9 10 11 我想我可以这样做 groupBy x y gt succ x y xs 但这会返回 1 2 3 4 6 7 9 10 11 进
  • 哪个 .NET 版本适用于 C# 5 异步功能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户必须在计算机上安装哪个版本的 N
  • python属性前后带有下划线有什么区别[重复]

    这个问题在这里已经有答案了 我想知道Python中这些有什么区别 self var1 self var1 self var1 self var1 作为起点 您可能会发现这句话很有帮助PEP 8 Python 代码风格指南 http www
  • 在编写 Spring Resource Bundle 时是否有单一规则来处理单引号?

    春天的ResourceBundleMessageSource uses MessageFormat用于替换占位符 0 内部消息 MessageFormat要求单引号 使用两个单引号 see 消息格式 Javadoc http docs or
  • 从文本块中删除停用词

    我正在处理一个文本块 步骤之一是删除停用词 Textblob 是不可变的 因此我将其转换为列表来完成这项工作 blob tb tekst lista word for word in blob words if word not in st
  • 可以同时延长2个课程吗?

    我有这些课程 public class myClassPage System Web UI Page public myClassPage public class myClassControl System Web UI UserCont
  • 碰撞检测和碰撞响应

    我一直在尝试使用 androids Opengl 来表示一些移动 旋转的对象 现在我想让他们碰撞并做出现实的反应 通过研究这个问题 我可以找到许多资源 这些资源建议我如何确定两个 3D 形状是否在当前帧中发生碰撞 或者它们是否会在下一帧中发
  • 有效合并大镶木地板文件

    我正在使用 parquet tools 来合并 parquet 文件 但 parquet tools 似乎需要与合并文件一样大的内存 我们是否有其他方法或 parquet tools 中的可配置选项来更有效地使用内存 因为我在 hadoop
  • 如何在android中的textview中缩进文本?

    我试图通过制作单独的段落来使文本更容易阅读 我尝试在字符串资源中的文本之前添加空格 但它不起作用 我想知道是否可以向文本视图或字符串资源本身添加属性 谢谢罗布 您可以使用 t 表示制表符 n 表示换行符 它肯定有效 并将此属性写入 xml
  • 无法使用 var 和 foreach 将 void 分配给隐式类型局部变量

    我正在尝试列出表单中的所有按钮名称以使用代码列出 var v new List
  • 如何阅读 FSM 图

    我如何获取该图并将其转换为可用的程序 我不太确定如何阅读该图 引导我完成它 也许会展示一个代码示例以及它与图表的关系 里面有文字的圆圈是州 文本描述了状态是什么 虚线箭头指向起始状态 传出箭头确定此状态可以更改的位置 箭头旁边是被线分为上半
  • Lua中如何快速初始化关联表?

    在Lua中 您可以通过以下方式创建表 local t 1 2 3 4 5 但是 我想创建一个关联表 我必须按以下方式进行 local t t foo 1 t bar 2 下面给出了一个错误 local t foo 1 bar 2 有没有办法
  • 在 QML 中解析 JSON [重复]

    这个问题在这里已经有答案了 相关的 Qt 文档应该是this http doc qt io qt 5 json html 但它没有提到 QML 然而 在网上的许多地方 我发现了类似功能的用法JSON parse在 QML JS 中 有这样的
  • 如何将 MediatR 与我的业务层解耦

    早上好 我在项目中使用域事件 我发现实现它的最简单方法是使用 MediatR 但我不希望我的项目直接依赖它 我想应用依赖倒置来隐藏库 由于 INotification 接口 当前代码依赖于 Mediator public class Ema
  • 片段已在 viewpager 中添加了 IllegalStateException

    我正在使用 viewpager 来显示图片 我基本上只需要三个片段 上一个要预览的图像 当前显示的图像和下一个要预览的图像 我想只显示上一张和下一张图像的预览 当用户实际滑动到它时 它将更改为完整图像 所以我想只使用 3 个片段来实现这一点