Как сделать ViewPager2 менее чувствительным?

Я использую ViewPager2 в своем приложении, у него есть три страницы, и на каждой странице отображается разное содержимое, проблема в том, что слишком разумно то, что ViewPager изменит страницы, даже если кто-то прокручивает вниз и по ошибке перемещает палец немного вправо или ушел.

Итак, как я могу сделать ViewPager менее чувствительным? ViewPager2 создается в Activity

Вот мой код, в котором я инициализирую ViewPager:

private lateinit var viewPager: ViewPager2
private lateinit var adapterView: ViewPagerAdapter

private fun initViewPager() {
    adapterView.addFragment(ElencoFragment())
    adapterView.addFragment(TestataFragment())
    adapterView.addFragment(CorpoFragment())
    adapterView.notifyDataSetChanged()

    viewPager.adapter = adapterView
    ...
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewPager = findViewById(R.id.pager)
    adapterView = ViewPagerAdapter(supportFragmentManager, lifecycle)
    ...
}

Мой адаптер:

 class ViewPagerAdapter
        (manager: FragmentManager, lifecycle: Lifecycle) :
        FragmentStateAdapter(manager, lifecycle) {

        private var fragmentList: ArrayList<Fragment> = ArrayList()

        override fun getItemCount(): Int {
            return fragmentList.size
        }

        override fun createFragment(position: Int): Fragment {
            return fragmentList[position]
        }

        fun addFragment(fragment: Fragment) {
            fragmentList.add(fragment)
        }
    }

person NiceToMytyuk    schedule 30.04.2021    source источник
comment
ViewPagerAdapter.addFragment() — это антипаттерн, который неизбежно приведет к сбоям. Пожалуйста, используйте метод createFragment() по назначению   -  person EpicPandaForce    schedule 30.04.2021
comment
Возможный обходной путь: используйте TabLayout и запретите прокрутку для перехода между страницами и разрешите это только с помощью вкладок. Я не слишком уверен в пользовательском опыте, если вы хотите добавить сопротивление смахиванию.   -  person JensV    schedule 04.05.2021


Ответы (2)


Чтобы уменьшить чувствительность горизонтальной прокрутки ViewPager, попробуйте это расширение

fun ViewPager2.reduceDragSensitivity() {
    val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
    recyclerViewField.isAccessible = true
    val recyclerView = recyclerViewField.get(this) as RecyclerView

    val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
    touchSlopField.isAccessible = true
    val touchSlop = touchSlopField.get(recyclerView) as Int
    touchSlopField.set(recyclerView, touchSlop*8)       // "8" was obtained experimentally
}

Источник

person Navjot Singh Bedi    schedule 07.05.2021

это отлично работает в моем подходе, я сохранил фрагменты как arrayList

внутри Действия

val listOfFragment = arrayListOf<Fragment>(
                F1(),
                F2(),
                F3(),
           
            )
            val adapter = TabsPagerAdapter(
                listOfFragment,
                requireActivity().supportFragmentManager,
                requireActivity(),
                0,
                lifecycle

            )

            viewPager1.adapter = adapter           

адаптер

class TabsPagerAdapter(val array: ArrayList<Fragment>,
                       val manager: FragmentManager,
                       val context: Context,
                       private val numTabs: Int,
                       lifecycle: Lifecycle): FragmentStateAdapter(manager, lifecycle){
    override fun createFragment(position: Int): Fragment {
        return array[position]
    }

    override fun getItemCount(): Int {
        return array.size
     }
    private fun getReadableTabPosition(position: Int) = position + 1

}

ПРИМЕЧАНИЕ. чувствительность может зависеть от компьютера, на котором вы работаете в данный момент, попробуйте переключить другие устройства.

person Ananiya Jemberu    schedule 05.05.2021