我有一個帶有 FragmentStateAdapter() 配接器的 viewpager2。我還有一個帶有 4 個選項卡的選項卡布局。我對所有選項卡使用單個片段。名為 AllOrdersTab。在我的架構中,我只是發送不同的值來將不同的 API 資料加載到 AllOrdersTab 片段。選擇每個選項卡布局時,會創建一個片段,并且第一次對所有 4 個片段都可以正常作業。之后,如果我滑回上一個選項卡,則不會再次創建或重繪 。我想重新創建片段或在選項卡之間滑動時再次呼叫 API 的方法。我也讀了這個頁面。
FragmentStateAdapter 在notifyDataSetChanged 后不重新創建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
}
}
在這里,我創建了 Allorderstab() 片段的 4 個實體。
設定 ViewPager2 配接器 MainFragment:
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)
}
}
}
總而言之,我不知道如何在 tabs 之間滑動時重繪 。如果我有所有 4 個標簽的單個片段。
uj5u.com熱心網友回復:
您有同一個選項卡的 4 個不同實體。如果每次用戶導航到您的選項卡時都需要重繪 選項卡,您需要向PageChangeListener選項卡視圖添加一個。然后,每當您更改頁面時,您都需要通知片段它已進入前臺,您可以通過呼叫Allorderstab類上的方法然后從該方法重繪 資料來實作。
uj5u.com熱心網友回復:
對于像我這樣為這個問題浪費一天時間的人,每次都想呼叫 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()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/404532.html
標籤:
上一篇:如何在片段中顯示來自firebase實時資料庫的recyclerView資料。安卓作業室
下一篇:從導航抽屜注銷
