如何在滑动 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()
}
我有一个 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()
}