簡體   English   中英

Android ViewPager2 如何獲取 onBindViewHolder 片段

[英]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 中的所有碎片也很昂貴

當用戶導航到上一個隱藏選項卡時說AddressesonBindViewHolder將被觸發(與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM