如何解决ViewPager2:以编程方式选择特定片段
我正在尝试以编程方式在 ViewPager2 中选择特定片段,例如第二个或第三个片段。它不能正常工作。有时有效,有时无效。尽管它每次都适用于 TabLayout。
我尝试过的:
- 我尝试过使用 ViewPager2.post 像
paymentViewpager.post { paymentViewpager.currentItem = 1 }
。 - 尝试在
paymentViewpager.setCurrentItem(tab.position,true)
回调中添加TabLayoutMediator
。 - 我已经仔细检查过,我在设置适配器后调用了
paymentViewpager.setCurrentItem
。
代码如下。
在 Activity 的 onCreate 中
if (!isGuestUser) {
getPaymentMethod()
viewModel.getMyProfile()
} else {
val adapter = SecureCheckoutPaymentSelectionAdapter(
activity = this,callback = this,gPayCallback = this,paypalCallBack = this,cardPaymentList = arrayListOf(),gPayPaymentDetail = arrayListOf(),payPalPaymentDetail = arrayListOf(),isPaymentMethodPresent = false,itemsCount = THREE,userType = userType,isGuestUser
)
binding.includeSecureCheckoutPaymentDetails.paymentViewpager.adapter = adapter
initTabLayout()
}
private fun initTabLayout() {
TabLayoutMediator(binding.includeSecureCheckoutPaymentDetails.paymentTab,binding.includeSecureCheckoutPaymentDetails.paymentViewpager) { tab,position ->
val view = DataBindingUtil.inflate<LayoutTabImageBinding>(LayoutInflater.from(this),R.layout.layout_tab_image,tab.view,true)
when (position) {
0 -> {
view.icon.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.card_payment))
}
1 -> {
view.icon.setBackgroundResource(R.drawable.google_pay_primary_logo)
}
else -> {
view.icon.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.paypal_card))
}
}
tab.customView = view.root
binding.includeSecureCheckoutPaymentDetails.paymentViewpager.setCurrentItem(tab.position,true)
}.attach()
}
当 API 响应在一段时间后出现时,我需要选择 ViewPager2 的 2nd Fragment。下面的代码在该函数中执行。
val adapter = SecureCheckoutPaymentSelectionAdapter(
activity = this,cardPaymentList = if (userType == PERSONAL_USER_TYPE) paymentSavedResponse.personalCards as ArrayList<PaymentMethod>
else paymentSavedResponse.businessCards as ArrayList<PaymentMethod>,gPayPaymentDetail = paymentSavedResponse.googlePay as ArrayList<GooglePay>,payPalPaymentDetail = paymentSavedResponse.paypalAccount,isPaymentMethodPresent = paymentSavedResponse.paymentMethodPresent,isGuestUser
)
binding.includeSecureCheckoutPaymentDetails.paymentViewpager.adapter = adapter
initTabLayout()
setViewPagerClick()
if (paymentSavedResponse.latestPaymentDetails?.paymentMethodPresent == true) {
Log.e("mk","in paymentMethodPresent == true...")
when {
paymentSavedResponse.latestPaymentDetails.paymentMethod.size > ZERO -> {
Log.e("mk","in card...")
binding.includeSecureCheckoutPaymentDetails.apply {
paymentViewpager.currentItem = ZERO
//paymentTab.selectTab(paymentTab.getTabAt(ZERO))
}
}
paymentSavedResponse.latestPaymentDetails.googlePay.size > ZERO -> {
Log.e("mk","in GPay...")
binding.includeSecureCheckoutPaymentDetails.apply {
paymentViewpager.currentItem = ONE
//paymentTab.selectTab(paymentTab.getTabAt(ONE))
}
}
else -> {
Log.e("mk","in Else...")
binding.includeSecureCheckoutPaymentDetails.apply {
paymentViewpager.currentItem = TWO
//paymentTab.selectTab(paymentTab.getTabAt(TWO))
}
}
}
}
我遇到了同样的问题 here,但尚未接受答案。任何帮助将不胜感激。
解决方法
我在使用 ViewPager2
时遇到了这个问题,对我来说原因是启用了 smoothScroll(setCurrentItem 中的第二个参数),因为启用它会使 ViewPager
转到错误页面
所以修复是禁用它:
binding.includeSecureCheckoutPaymentDetails.paymentViewpager.setCurrentItem(tab.position,false)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。