当前位置: 首页 > 知识库问答 >
问题:

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

穆华彩
2023-03-14

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

notifyDataSetChanged后FragmentStateAdapter未重新创建currentFragment

我试图这样做。所以我决定创建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个标签。

共有2个答案

华锦程
2023-03-14

对于像我这样浪费了一天时间来解决这个问题的人,希望每次都调用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()
}
陆洛城
2023-03-14

同一选项卡有4个不同的实例。如果每次用户导航到选项卡时都需要刷新选项卡,则需要在选项卡视图中添加一个页面更改侦听器。然后,每当您更改页面时,您需要通知片段它已经出现在前台,您可以通过调用Allorderstab类上的方法,然后刷新此方法中的数据来完成此操作。

 类似资料:
  • 我有一个,有4个选项卡。

  • 问题内容: 我有以下代码: MainActivity.java TabsPagerAdapter.java 我正在制作一个图书馆应用程序,其中导航是通过选项卡进行的,问题是每次我从第三个选项卡转到第一个或第一个至第三个时,选项卡的内容都在刷新,我想防止刷新,任何请帮助 ? 问题答案: 默认情况下,在滑动页面时会重新创建片段。为防止这种情况,您可以尝试以下三种方法之一: 1. 在您的片段中,呼叫。

  • 我在android中使用BottomNavigationView来制作一个像Instagram一样的应用程序。我在NavigationTabs中使用片段。应用程序有5个标签初始我已经设置为活动标签的中间标签和加载它一旦应用程序启动。当我单击任何其他选项卡时,就会进行网络调用并加载数据。现在,当我按下on back按钮或再次单击last选项卡(在启动时加载)时,片段将被重新创建,并进行网络调用以加载

  • } 我使用android ViewPager,当我点击不同的标签时,使用不同的片段来加载。但问题是,当我单击选项卡时,片段没有加载。当活动加载时,所有的片段都被加载,那么片段就不会改变。我如何解决这个问题?我需要加载片断时,我选择选项卡在查看页。

  • 我使用ViewPager作为主布局,对于单个寻呼机视图,我使用Fragments。选项卡是操作栏的一部分。我想使用操作栏中的刷新按钮刷新当前选项卡。 我的MainActivity.java 这是我的一个Tabs StartPage.java

  • 当我使用按钮尝试使用方法更新Firebase realtime database中的数据时,每当我单击该按钮时,它都会重新创建该活动。Firebase的'set value()'是否自动重新创建活动?如果有,如何防止?