我有 3 個片段 - F1、F2 和 F3。我已將它們附加在 PagerAdaper (viewPager2) 中。PagerFragment 中的 PagerAdapter 的初始化(在 onCreateView 中)是 -
binding = PagerFargmentBinding.inflate(inflater, container, false)
adapter = PagerAdapter(this)
binding?.viewPager?.adapter = adapter
binding?.viewPager?.isSaveEnabled = false
現在,我的 PagerAdapter 實作 -->
class PagerAdapter(
fragment: PagerFragment,
) : FragmentStateAdapter(fragment) {
private var nextFragment: BaseFragment? = null
private var baseFragment: BaseFragment = F1()
override fun getItemCount() = 2
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> {
baseFragment
}
else -> {
nextFragment ?: DummyDialogFragment()
}
}
}
fun setNextFragment(page: Int) {
nextFragment = null
nextFragment = if (page == 1) {
F2()
} else if (page == 2) {
F3()
} else {
null
}
}
}
現在從我的尋呼機片段中,我正在設定下一個片段-
fun navigateTo(page: Int) {
adapter.setNextFragment(page)
if (page == 0) {
binding?.viewPager?.currentItem = page
} else {
binding?.viewPager?.currentItem = 1
}
}
從 F1 片段我用 1 和 2 呼叫這個函式。這是第一次正常作業。 如果是第一次,如果我將 F2 片段作為 nextFragment 加載,則 F3 片段不會顯示。 我試過除錯,發現 nextFragment 值正在更新,但不知何故,添加的片段沒有從尋呼機配接器中洗掉。
有什么方法可以讓我動態添加/洗掉片段嗎?
我從這個塊中獲取了實作想法 - https://intensecoder.com/android-swipe-fragments-with-viewpager2-in-kotlin/
uj5u.com熱心網友回復:
好吧,在對 stackoverflow 進行了相當多的探索,然后在我的一位同行的幫助下,我找到了解決方案。解決辦法是——
實際上問題是,createFragment() 在第一次之后沒有觸發。所以我要重寫StatePagerAdapter 的兩個函式——getItemViewType() 和getItemId()。我現在的實施 -
class PagerAdapter(
fragmentManager: FragmentManager,
lifecycle: Lifecycle
) : FragmentStateAdapter(fragmentManager, lifecycle) {
private var viewType: Int = 0
override fun getItemCount() = 2
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> {
F1()
}
1 -> {
F2()
}
else -> {
F3()
}
}
}
override fun getItemViewType(position: Int): Int {
return when (position) {
0 -> 0
else -> viewType
}
}
override fun getItemId(position: Int): Long {
return when (position) {
0 -> 0
else -> viewType.toLong()
}
}
fun setNextFragment(page: Int) {
this.viewType = page
}
}
并從尋呼機片段中呼叫它-
fun navigateTo(page: Int) {
adapter.setNextFragment(page)
if (page == 0) {
binding?.viewPager?.currentItem = page
} else {
binding?.viewPager?.currentItem = 1
}
}
setNextFragment() 分配所需的 F2() 或 F3() 片段。在 getItemId() 和 getItemViewType() 上的覆寫實作的幫助下,每次都會呼叫 createFragment(),因此我可以動態添加/洗掉片段。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/495483.html
標籤:安卓片段 安卓适配器 android-viewpager2