【问题标题】:ViewPager2: Select particular fragment programmaticallyViewPager2:以编程方式选择特定片段
【发布时间】:2021-07-20 19:10:59
【问题描述】:

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

我尝试过的:

  1. 我已尝试使用 ViewPager2.post,例如 paymentViewpager.post { paymentViewpager.currentItem = 1 }
  2. 尝试在TabLayoutMediator 回调中添加paymentViewpager.setCurrentItem(tab.position, true)
  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))
                                    }
                                }
                            }
                        }

我遇到了同样的问题here,它还没有被接受的答案。任何帮助将不胜感激。

【问题讨论】:

    标签: android android-fragments android-tablayout android-viewpager2 fragmentstateadapter


    【解决方案1】:

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

    所以解决方法是禁用它:

    binding.includeSecureCheckoutPaymentDetails.paymentViewpager.setCurrentItem(tab.position, false)
    

    【讨论】:

    • 好的。如果您需要我方面的任何进一步信息,请告诉我。
    • 你可以试试paymentViewpager.postDelayed() 有一些延迟
    • 我试过了,不过让我再试一次。 @Zain
    • 我尝试过 500 和 1000 毫秒,它很少不起作用。大多数时候它正在工作。这是一个适当的解决方案吗? @Zain
    • 不,它应该是最大的 100 毫秒或 200 毫秒,大于这不应该是正确的解决方案,我们只需要确保在主线程循环中的任何其他 UI 事物上都没有挂起。 .. 一定有其他原因造成这种情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2012-02-01
    • 2012-04-24
    • 2016-12-05
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多