gpt4 book ai didi

Android ViewPager2如何检索 fragment onBindViewHolder

转载 作者:行者123 更新时间:2023-12-04 23:50:57 27 4
gpt4 key购买 nike

ViewPager 发布 1.0.0 版本

对于普通的 RecyclerView,holder.itemView给我当前绑定(bind)/渲染的 View 。

但是,FragmentStateAdapter 的 holder.itemView只给我一个 FrameLayout

我的 ViewPager 适配器:

class MyFragmentStateAdapter(activity: FragmentActivity) :
FragmentStateAdapter(activity) {
var items = mutableListOf<String>()
override fun createFragment(position: Int): MyPageFragment {
val itemText = items[position]
return MyPageFragment.create(itemText)
}

override fun getItemCount(): Int = items.size

override fun onBindViewHolder(
holder: FragmentViewHolder,
position: Int,
payloads: MutableList<Any>
) {
super.onBindViewHolder(holder, position, payloads)
val fragment = ??? as MyRefreshableInterface
fragment.refresh()
}

fun update(mutableListOf: MutableList<String>) {
this.items = mutableListOf
notifyDataSetChanged()
}
}

上下文

我有少量且固定数量的选项卡显示用户配置文件的不同信息部分。在某些事件中,我需要尽快自动刷新所有选项卡。换句话说,除了用户正在查看的当前选项卡之外,我还需要刷新当前隐藏的选项卡。

ASAP = 用户下次访问当前隐藏的选项卡时。用户去那里,他们首先看到的是加载动画。那挺好的

为什么不马上?

因为隐藏的 fragment 可以被分离/破坏。无论如何,用户现在没有在看。将所有 fragment 保留在内存中也很昂贵

当用户导航到上一个隐藏选项卡时说地址, onBindViewHolder将被触发(这与 ViewPager 1 相比很棒)但是,差距是我没有当前选择的 fragment 的引用

其他发现

我已经尝试引用 fragmentActivity.supportFragmentManager.fragments但它似乎最多有 4 个 fragment ,而我有 6 个 fragment/页面,为了测试

最佳答案

你似乎在问两个不同的事情。

I need to refresh automatically all the tabs. In other words, I need to refresh the currently-hidden tabs besides the current tab user is looking at.





When user navigates to previous hidden tab say Addresses, onBindViewHolder will be triggered.



当显示在第二项上时,您正在尝试进行更新。

这个“显示时更新”很容易使用 viewpager2,当显示 fragment 时, fragment 会从“开始”进入生命周期状态“恢复”。

因此创建一个 update方法在每个 fragment 中,然后在 fragment 中 onResume方法调用 update方法。

(这就是我在我的应用程序中所做的)

更新:
有关此行为的文档在 viewpager2 中很糟糕,我能找到的最好的是源代码中的注释 https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java#634

/** * Pauses (STARTED) all Fragments that are attached and not a primary item. * Keeps primary item Fragment RESUMED. */



或发行说明 https://developer.android.com/jetpack/androidx/releases/viewpager2#1.0.0-alpha06

FragmentStateAdapter: non-primary-item Fragments are capped at STARTED, and their menuVisibility is set to false.



Androidx 中的 Viewpager 1 已更新为 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT匹配 Viewpager2 的行为
https://developer.android.com/reference/androidx/fragment/app/FragmentStatePagerAdapter#BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT

“更新所有 fragment ”有点难,但我相信您可以执行以下操作(抱歉,我的 Kotlin 无法提供代码示例。

在适配器构造函数中创建并存储 fragment 列表(不仅仅是 itemText)
例如项目中的 foreach 项目添加到 fragment 列表 MyPageFragment.create(itemText)

然后在 createFragment只需从列表的正确位置返回 fragment 。
例如 return fragments[position]
然后在您的适配器中 update您遍历 fragment 列表中的所有项目,调用 update在每个 fragment 上。

(这基本上是在适配器中维护您自己的 fragment 列表,而不是在调用 createFragment 时动态创建它们)

更新:
正如评论中所指出的,这不太理想,并且打破了 Viewpager2 的 fragment 生命周期概念和效率, onResume 中的更新 fragment 更好。

关于Android ViewPager2如何检索 fragment onBindViewHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com