0

我正在尝试以编程方式选择特定片段,例如 ViewPager2 中的第二个或第三个片段。它无法正常工作。有时有效,有时无效。虽然它每次都适用于 TabLayout。

我试过的:

  1. 我试过使用ViewPager2.post 之类的paymentViewpager.post { paymentViewpager.currentItem = 1 }
  2. 尝试添加回调paymentViewpager.setCurrentItem(tab.position, true)TabLayoutMediator
  3. 我已经仔细检查了我在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,
                                callback = this,
                                gPayCallback = this,
                                paypalCallBack = 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,
                                itemsCount = THREE,
                                userType = userType,
                                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))
                                    }
                                }
                            }
                        }

我在这里遇到了同样的问题,但尚未接受答案。任何帮助,将不胜感激。

4

1 回答 1

1

我遇到了这个问题ViewPager2,对我来说,原因是启用了 smoothScroll (setCurrentItem中的第二个参数),因为启用它会导致ViewPager转到错误的页面

所以修复是禁用它:

binding.includeSecureCheckoutPaymentDetails.paymentViewpager.setCurrentItem(tab.position, false)
于 2021-04-27T12:45:39.607 回答