如何在滑动 ViewPager2 选项卡时重新创建或刷新片段

How to recreate or refresh fragment while swiping ViewPager2 tabs

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

我试过这样做。所以我决定创建 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() Fragment 实例。

设置 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 个选项卡的单个片段。

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

对于那些像我一样为这个问题浪费了一天时间,每次都想调用 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()
}