Viewpager2 Android: кнопка «Далее» в представлении создает два слайда вправо.

Я застрял на проблеме viewpager2 на Android. У меня есть viewpager2, создающий некоторые фрагменты в зависимости от позиции. Каждый фрагмент имеет следующую кнопку для горизонтальной навигации в пейджере просмотра.

Но когда я запросил следующую страницу с помощью кнопки, у меня было действие двойного скольжения. Это похоже на то, что метод createFragment из адаптера был вызван дважды из-за предварительной загрузки границ фрагмента ...

Действия, управляющие просмотром пейджера:

class ConfigurationActivity : AppCompatActivity() {
    private var viewPager : ViewPager2? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_configuration)

        viewPager = viewPager2
        val instance = this

        viewPager!!.apply {
            isUserInputEnabled = true
            orientation = ViewPager2.ORIENTATION_HORIZONTAL

            if(viewPager!!.adapter == null)
                viewPager!!.adapter = ConfigAdapter(supportFragmentManager, lifecycle, instance, 2)
        }

        viewPager!!.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                super.onPageSelected(position)          
                currentItem = position
            }
        })
    }

    companion object{
        private var currentItem : Int = 0

        fun nextPage(instance : ConfigurationActivity, currentPosition : Int?){
            instance.viewPager!!.currentItem = currentItem + 1
        }
    }
}

FragmentStateAdapter

class ConfigAdapter(fm: FragmentManager, lc : Lifecycle, private val instance : ConfigurationActivity, configSnapshot : ArrayList<Configuration>) : FragmentStateAdapter(fm, lc) {
    private val configSize = configSnapshot.size

    override fun getItemCount(): Int {
        val length = configSize + 3
        instance.pageIndicatorView.count = length
        return length
    }

    override fun createFragment(position: Int): Fragment {
        Timber.d("creating fragment at position $position")
        return when(position){
                0 -> WelcomeFragment(instance)
                in 1..configSize /* position between 1 and configSize (included) */ -> ConfigureFragment(instance, position-1)
                1 + configSize -> IdentifyFragment(instance)
                2 + configSize -> EndFragment()
                else -> Fragment()
            }
    }
}

Пример фрагмента:

class ConfigureFragment(private val instance : ConfigurationActivity, private val configPosition: Int) : Fragment() {
...
   view.button_continue.setOnClickListener {
       nextPage(instance, configPosition+1)
   }
...
}

person Kamenber    schedule 14.10.2019    source источник


Ответы (1)


Попробуйте так: -

  • Прежде всего, измените viewPager переменную private на public в Activity, например, удалив ключевое слово private.

    var viewPager : ViewPager2? = null

  • Во фрагменте измените метод setOnClickListener, как показано ниже:

    view.button_continue.setOnClickListener { instance!!.viewPager!!.arrowScroll(View.FOCUS_RIGHT) }

*Предположение:

  • Во фрагменте мы можем получить экземпляр родительской активности и использовать этот способ вместо передачи экземпляра активности каждому фрагменту.

    val instance = ((activity as AppCompatActivity) as ConfigurationActivity)

person Nitin Patel    schedule 14.10.2019
comment
Спасибо за этот ответ, я применил предложенный код, но это не меняет проблемы. - person Kamenber; 14.10.2019
comment
Вместо ViewPager2 попробуйте использовать только ViewPager. Я пробовал, и это работает. - person Nitin Patel; 14.10.2019
comment
@Kamenber Вы пробовали новый способ в setOnClickListener в соответствии с измененным (обновленным) кодом? - person Nitin Patel; 14.10.2019
comment
@Kamenber Также вы можете прокомментировать этот viewPager!!.registerOnPageChangeCallback... код и попробовать его. - person Nitin Patel; 14.10.2019