【问题标题】:How to recreate or refresh fragment while swiping ViewPager2 tabs如何在滑动 ViewPager2 选项卡时重新创建或刷新片段
【发布时间】:2021-12-26 12:03:49
【问题描述】:

我有一个 viewpager2,里面有 FragmentStateAdapter() 适配器。我还有一个带有 4 个选项卡的选项卡布局。我对所有选项卡使用单个片段。名为 AllOrdersTab。 在我的架构中,我只是发送不同的值来将不同的 API 数据加载到 AllOrdersTab 片段。 选择每个选项卡布局时,为所有4个碎片首次创建并正常工作。之后,如果我滑回上一个选项卡,则不会再次创建或刷新它。 我想重新创建片段或在选项卡之间滑动时再次调用 API 的方法。我也读过这个页面。

FragmentStateAdapter not recreating currentFragment after notifyDataSetChanged

我试图这样做。所以我决定创建 4 个 Allorderstab() 片段实例。但从来没有为我工作,因为我猜片段的哈希码是相同的。

ViewPager2 适配器:

class ViewPagerOrdersAdapter(fm: FragmentManager,val listFragments:MutableList<Fragment>, viewlifecycler: Lifecycle) : FragmentStateAdapter(fm, viewlifecycler)
{

    override fun getItemCount(): Int
    {
        return listFragments.size
    }

    override fun createFragment(position: Int): Fragment {
        val args = Bundle()

        when (position) {
            1 -> {
                args.putString("KEY_ID", "inProgress")
                listFragments[position].arguments = args
                return listFragments[position]
            }
            2 -> {
                args.putString("KEY_ID", "cancel")
                listFragments[position].arguments = args
                return listFragments[position]
            }
            3 ->
            {
             args.putString("KEY_ID","deliver")
                listFragments[position].arguments=args
                return listFragments[position]
            }
            else -> {
                args.putString("KEY_ID", "all")
                listFragments[position].arguments = args
                return listFragments[position]
            }
        }

    }

    override fun getItemId(position: Int): Long {
        return   listFragments[position].hashCode().toLong()
    }

    override fun containsItem(itemId: Long): Boolean {

        return listFragments.find {it.id.hashCode().toLong() == itemId } != null
    }


}

在这里我创建了 4 个 Allorderstab() 片段实例。

设置 ViewPager2 适配器 主片段:

    val fragments:MutableList<Fragment> = mutableListOf(Allorderstab(), Allorderstab(), Allorderstab(), Allorderstab())

    vp.setAdapter(ViewPagerOrdersAdapter(this.childFragmentManager,fragments, lifecycle))

AllOrderstab 片段:

override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?, savedInstanceState: Bundle?): View? {
 val bundle = arguments
       bundle?.let {
           val myStatus = bundle.getString("KEY_ID")
           myStatus?.let{
               //getting history of each tab orders - calling API
               myviewModel.getOrdersHistory(tempTn,myStatus)
           }
       }
}

总而言之,我不知道如何在标签之间滑动时刷新。如果我对所有 4 个选项卡都有一个片段。

【问题讨论】:

    标签: android kotlin android-fragments android-viewpager2


    【解决方案1】:

    同一个标签有 4 个不同的实例。如果您需要在每次用户导航到您的选项卡时刷新选项卡,您需要将PageChangeListener 添加到您的选项卡视图。然后,每当您更改页面时,您都需要通知片段它已进入前台,您可以通过调用Allorderstab 类上的方法然后刷新此方法中的数据来做到这一点。

    【讨论】:

    • 谢谢,但您的解决方案不适合与 Viewpager2 的 FragmentStateAdapter 适配器一起使用且不兼容。我认为它会干扰 MVVM 架构。
    • @NimaAzhd 这可能不是最适合您的用例,但不违反 MVVM 模式。
    【解决方案2】:

    对于像我这样为这个问题浪费一天时间的人,想每次都调用 API 来刷新数据,请将您的代码移至 onResume 函数。幸运的是,每次您的片段可见时它都会运行。

    AllOrderstab 片段:

    override fun onResume() {
        val bundle = arguments
        bundle?.let {
            val myStatus = bundle.getString("KEY_ID")
            myStatus?.let{
                //getting history of all orders
                myviewModel.getOrdersHistory(tempTn,myStatus)
            }
        }
    
        super.onResume()
    }
    

    【讨论】:

    • 嘿,你能帮我解决这个问题吗issue
    • @vivekmodi 我在 YouTube 链接中看到了您的问题。不幸的是,我还没有使用 paging3 库。也许有一个错误或与生命周期相关的东西。这里我使用 viewpager2 (FragmentStateAdapter) 和 Tablayout。
    • 感谢回复我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多