ViewPager2 бесконечная прокрутка - PullRequest
0 голосов
/ 25 апреля 2020

Я реализовал пользовательское представление календаря на холсте и хочу добавить его в ViewPager2.

У меня есть адаптер для проверки поведения прокрутки:

class ViewPagerAdapter(private val viewPagerView: ViewPager2) :
        RecyclerView.Adapter<ViewPagerAdapter.ViewHolder>() {

        private val colors = arrayListOf(
            R.color.green,
            R.color.indigo,
            R.color.blueGray,
            R.color.brown,
            R.color.color_orange_300
        )

        fun scrolledLeft() {
            //colors.removeAt(colors.size - 1)
            colors.add(0, R.color.brown)
            //notifyItemRemoved(colors.size - 1)
            notifyItemInserted(0)
        }

        fun scrolledRight() {
            //colors.removeAt(0)
            colors.add(R.color.green)
            //notifyItemRemoved(0)
            notifyItemInserted(colors.size - 1)
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.pager_item, parent, false)
        )

        override fun getItemCount(): Int = colors.size

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.bind("item $position", colors[position])
        }

        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

            private val textView = itemView.findViewById<TextView>(R.id.text)
            private val root = itemView.findViewById<View>(R.id.root)

            fun bind(text: String, color: Int) {
                textView.text = text
                root.setBackgroundColor(ContextCompat.getColor(itemView.context, color))
            }
        }
    }

Слушатель:

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

        Log.d("abcd", "count: ${viewPagerAdapter.itemCount}")

        if (lastDirection == Direction.RIGHT) {
            viewPagerAdapter.scrolledRight()
        } else if (lastDirection == Direction.LEFT) {
            viewPagerAdapter.scrolledLeft()
        }
    }

    override fun onPageScrolled(position: Int, posOffset: Float, posOffsetPixels: Int) {
        super.onPageScrolled(position, posOffset, posOffsetPixels)

        if (lastViewPagerPosition > position) {
            lastDirection = Direction.LEFT
        } else if (lastViewPagerPosition < position) {
            lastDirection = Direction.RIGHT
        }
        lastViewPagerPosition = position
    }
})

Моя логика c была такой: у нас 5 страниц и мы начинаем с индекса 2. При прокрутке вправо удаляем страницу с индексом 0 и добавляем новую страницу в конец. При прокрутке влево, удалении последней страницы и добавлении новой страницы с индексом 0. Но если вы закомментируете строки, поведение будет некорректным.

Я не хочу использовать Int.MAX_VALUE или фрагменты!

...