[英]Android ViewPager2 how to retrieve the fragment onBindViewHolder
ViewPager 發布 1.0.0 版本
對於普通的 RecyclerView, holder.itemView
為我提供了當前綁定/渲染的視圖。
然而,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 = 下次用戶訪問當前隱藏的選項卡時。 用戶去那里,他們首先看到的是加載 animation。這很好
為什么不馬上呢?
因為隱藏的碎片可能會被分離/銷毀。 無論如何,用戶現在沒有在看。 保留 memory 中的所有碎片也很昂貴
當用戶導航到上一個隱藏選項卡時說Addresses , onBindViewHolder
將被觸發(與 ViewPager 1 相比這很棒)但是,差距在於我沒有引用當前選擇的片段
其他發現
我已經嘗試引用fragmentActivity.supportFragmentManager.fragments
但它似乎最多有 4 個片段,而我有 6 個片段/頁面,為了測試
你似乎在問兩件不同的事情。
我需要自動刷新所有選項卡。 換句話說,除了當前用戶正在查看的選項卡之外,我還需要刷新當前隱藏的選項卡。
和
當用戶導航到上一個隱藏的選項卡說地址時,將觸發 onBindViewHolder。
當顯示在第二個項目上時,您正在嘗試進行更新。
這種“顯示時更新”對於 viewpager2 很容易,當顯示片段時,片段被帶到生命周期 state 從“開始”“恢復”。
從而在每個Fragment中創建一個update
方法,然后在Fragments的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的
/** * 暫停(開始)所有附加的片段而不是主要項目。 * 保持主要項目片段恢復。 */
或發行說明https://developer.android.com/jetpack/androidx/releases/viewpager2#1.0.0-alpha06
FragmentStateAdapter: non-primary-item Fragments 的上限為 STARTED,並且它們的 menuVisibility 設置為 false。
Androidx 中的 Viewpager 1 已更新為BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
以匹配 Viewpager2 的行為請參閱https://developer.android.com/reference/androidx/fragment/app/FragmentStatePagerAdapter#BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
“更新所有片段”有點難,但我相信您可以執行以下操作(抱歉,我的 Kotlin 沒有達到標准,無法提供代碼示例。
在適配器構造函數中創建並存儲片段列表(不僅僅是 itemText)
例如,foreach 項目中的項目添加到片段列表 MyPageFragment.create(itemText)
然后在createFragment
中,只需返回列表中正確的 position 中的片段。
例如return fragments[position]
然后在您的適配器update
中,您遍歷片段列表中的所有項目,調用每個片段的update
。
(這基本上是在適配器中維護您自己的片段列表,而不是在調用createFragment
時即時創建它們)
更新:
正如評論中指出的那樣,這不太理想並且打破了 Viewpager2 的片段生命周期概念和效率,片段的onResume
中的更新更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.