问题标签 [fragmentstatepageradapter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1680 浏览

android - FragmentStatePagerAdapter 性能问题

我已经实现了一个在 viewpager 中显示片段的活动。活动最初显示给定类型(类型 A)的 5 个片段。每个 A 类片段都包含一个信息列表。当一个按钮被按下时,片段被另一个类型的片段替换,类型 B(即,使用不同布局并显示不同信息的片段被加载)。

我已经使用 ViewPager 和自定义 FragmentStatePagerAdapter 实现了这一点。自定义的 FragmentStatePagerAdapter 覆盖了 getCount、instantiateItem、getItem、getItemPosition 等函数,一切正常。当我按下按钮时,视图会从片段类型 A 切换到片段类型 B。为了做到这一点,我正在使用替换片段事务,并且我还在适配器上调用 notifyDataSetChanged。从 A 类片段到 B 类片段的切换是通过在适配器的 getItem 函数中检查我需要创建哪种类型的片段来完成的。问题是切换过程(即,从片段类型 A 更改为片段类型 B,反之亦然)需要一些时间(大约 2 秒) - 这种延迟非常明显且令人讨厌。

这是因为适配器的 getItemPosition 函数返回 POSITION_NONE。返回 POSITION_NONE 时,viewPager 会重新创建片段。此外,当执行替换事务时,适配器的所有项目都将被删除并重新创建所有新项目。当我切换回片段类型 A 时也会发生同样的情况。

有谁知道是否有更好或更快的方法来做到这一点?使用 FragmentPagerAdapter 应该不是一个好的解决方案,因为 viewPager 中的片段数量可能会增加。

我已经注释掉了片段的更新,问题就消失了,所以问题是更新片段所需的时间。有没有办法异步更新片段?那应该解决这个问题。

0 投票
0 回答
330 浏览

android - 如何保存手动设置的 ViewPager Fragments 的 InstanceState(深入解释)?

我有一个 ViewPager (用FragmentStatePagerAdapter实例化),上面附有一些 Fragment。

在特定用例中,我需要为寻呼机中的大多数片段重置 instanceBean 和 UI。

经过一番谷歌搜索后,我尝试了一些这样的解决方案,副作用不容易管理。像这样的其他解决方案不符合我的需求。

所以我决定直接手动重置UI 和 instanceBean obj,如下面的代码所示:

编码

单片断重置

这是通过父 Activity 中的以下代码完成的:

从父级重置片段

AfterViews 方法:

OnSavedInstanceState


为什么我要在重置之前设置每一页?

因为就像这里解释的那样:

当页面对用户不可见时,它们的整个片段可能会被销毁,只保留该片段的已保存状态。

并且因为直到我不选择相对片段,@AfterViews 方法(即在片段的 OnCreateView 之后立即处理的所有内容)都不会执行。这会出于一千个原因引发 NullPointerException(通常在 @AfterViews 方法中您启动 RestoreState 方法,初始化适配器,执行 UI 操作)。

在重置之前设置相关页面让 @AfterViews 方法被处理。


在检查旋转设备时会发生什么之前,我需要的所有片段都已正确重置。

旋转设备时,出现错误:

在我重置之前,视图(主要是 EditText)会回到它们以前的状态。

怎么了?

在页面之间切换时,页面会在某个时间点被销毁,并且每次对每个页面调用 OnSavedInstanceState。

我已经处理了 OnSavedInstanceState (如上),当布尔值为 false 时,它​​会保存状态,就像它刚刚创建时一样。

我发现直到在 AfterView 方法中,EditText 的文本设置为空白(就像我想要的那样),但继续调试 EditText 会回到它以前的状态,所以最后它会显示它拥有的最后一个文本。

问题

如何在销毁/重新创建片段后保留手动设置(在 OnSavedInstanceState 中)EditText 文本?

0 投票
1 回答
12543 浏览

android - ViewPager、FragmentStatePagerAdapter 和无限滚动

我想要达到的目标:

一个带有 ViewPager 的 Activity,它显示适配器 ( FragmentStatePagerAdapter) 中对象列表的片段。

最初,Activity 将 SQLite DB 中的 N 个(比如说 5 个)对象加载到适配器中。这些对象是随机选择的。

当用户到达列表末尾时,活动应从数据库加载 M(假设 M 为 3)更多对象,将它们添加到适配器并调用notifyDataSetChanged(). 添加它们时,我检查列表中是否已经存在新对象,如果存在,则删除预先存在的对象,并将加载的对象添加到列表的尾部。

因此,我试图实现类似无限滚动 ViewPager的东西(不是“循环” ViewPager,因为我希望不断地获取新对象,而不是回到列表的乞讨)。

我有一些工作代码,并包含了我在下面遵循的模式的示例。但是,我不断收到此异常,不知道为什么:

代码示例:

活动:

寻呼机适配器:

我的片段:

关于我为什么会得到这个的任何想法Exception?似乎他们FragmentStatePagerAdapter正在试图摧毁一个不再存在的项目,但我不明白为什么。

编辑1:

如果我评论我的@Override getItemPosition(Object object),我不会再得到例外。但是,我需要覆盖getItemPosition,因为有一个用例,其中用户删除当前显示的 Object 导致它从适配器的数组中消失,并在该项目不再存在时强制getItemPosition返回。POSITION_NONE

编辑2:

现在我知道只有当我从适配器的objectList. 我有两种情况,其中MyObject实例被删除objectList

  • getMoreObjects()添加从数据库中获取已经在 中的对象时objectList,我将其删除并将其重新添加到列表的头部。我这样做是为了避免在 objectList 中有具有相同 ID 的对象,因为它们的 ID 被用于getItemPosition()了解它们是否存在以及它们的位置。

  • 在返回之前,getMoreObjects()从列表中删除前 N 个对象。我知道 FragmentStatePagerAdapter 已经通过仅保留某些对象的内存片段来节省内存,但我仍然想避免增长objectList太多。现在,我已经评论了这一行,因为它并不那么重要。

0 投票
1 回答
177 浏览

java - OnPageSelected 从未达到,如何在片段中获取当前可见页面?

我尝试将接口放置在我的 Activity、我的片段和我的 FragmentStatePagerAdapter 中。但在所有这些中,代码从未到达那里。这就是我的 FragmentStatePagerAdapter 的样子,因为这是我的最新尝试。

FragmentStatePagerAdapter:

片段看起来像这样:

但是两者都没有工作,对我来说在片段中使用它是最有用的,但如果这是不可能的,那么活动或状态分页器也可以工作

0 投票
0 回答
875 浏览

android - 更改方向后不调用 FragmentStatePagerAdapter getItem 方法

我有活动和 3 个片段。我使用 PagerSlidingTabStrip 来支持标签。适配器:

活动

当应用程序第一次加载时getItem执行 3 次。什么是正确的。显示了第一个片段。然后在第一个片段的更改循环后getItem不执行。但是当我切换到秒或第三个时getItem执行。

你能帮我为什么当屏幕方向改变时没有为第一个片段调用 getItem 吗?

0 投票
1 回答
147 浏览

android - 当每个 Fragment 来自不同的类时,如何使用 FragmentStatePagerAdapter 或 FragmentPagerAdapter?

我想使用 FragmentStatePagerAdapter 或 FragmentPagerAdapter 能够刷过 3 个不同的片段。每个单独的片段都来自不同的类。我不太确定应该在哪里创建新对象。是否应该在 getItem 函数中完成?我看到的大多数示例都使用相同类型的片段。

先感谢您!

0 投票
2 回答
14869 浏览

android - Android setUserVisibleHint 永远不会被调用?

我需要知道我的片段何时可​​见,我正在使用 setMenuVisibility 但我现在知道这不是一个好选择。我正在尝试在 FragmentStatePagerAdapter 片段上实现 setUserVisibleHint,但是它永远不会被调用。

我正在运行 API 级别 19,并在我的 AndroidManifest 上设置了最低 API 级别 15。要获得 setUserVisibleHint,还有其他事情要做吗,我做错了什么?

0 投票
1 回答
142 浏览

android - 使用片段状态适配器基于 JSON 源加载许多片段

我有一个片段状态寻呼机适配器和一个问题列表,我从服务器检索为 JSON。有谁知道我如何动态地(基于从服务器返回的问题数量),创建同一片段的许多实例,并将它们加载到我的活动视图中?

0 投票
1 回答
3815 浏览

android - 由于导航回旧片段,查看 Pager Crash Null Pointer Exception - Android

我正在使用视图寻呼机在页面之间导航。我正在使用 FragmentStatePagerAdapter。我可以毫无问题地向一个方向滑动。但如果我刷回旧的。它正在崩溃。我收到空指针异常。

这是我的代码:

这是我的片段类:

0 投票
4 回答
3621 浏览

android - 如何在一次显示多个片段的同时在查看器中查找当前可见的片段

我正在构建一个应用程序,其中使用 ViewPager 和 FragmentStatePagerAdapter 一次显示多个片段。以下是我正在做的事情:

ViewPager 的屏幕截图

我的问题是如何找到哪些片段是可见的?(例如屏幕截图中的片段 1、2 和 3)

我知道 abot pager.setOnPageChangeListenerFragment.setUserVisibleHint(boolean isVisibleToUser)但对我没用:-(

非常感谢您的帮助。谢谢!!!