在viewpager2中无限滚动

nik*_*har 4 java android android-viewpager2

我们如何在 ViewPager2 中实现无限滚动

因为OnPageChangeListener()在这个寻呼机中没有。但是setPageTransformer()每当我们更改页面时,都会有Listener 获取回调。

因此,viewpager2 问题的任何解决方案

注意:我正在为 viewpager2 使用 recyclerview 适配器

Kal*_*ani 5

第 1 步:创建 EndlessScrollAdapter 类

class EndlessScrollAdapter internal constructor(
    fm: FragmentManager,
    lifeCycle: Lifecycle
) : FragmentStateAdapter(fm, lifeCycle) {

    private val items = mutableListOf<Model>()
    val firstElementPosition = Int.MAX_VALUE / 2

    fun updateList(list: List<Model>) {
        items.apply {
            clear()
            addAll(list)
        }
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = if (items.isNotEmpty()) Int.MAX_VALUE else 0

    override fun createFragment(position: Int): Fragment = ViewPagerFragment(
        items[position.rem(items.size)])
}
Run Code Online (Sandbox Code Playgroud)

步骤:2 从 Activity 或 Fragment 调用

viewPager2.adapter = endlessScrollAdapter
endlessScrollAdapter.apply {
  updateList(someModelList)
  viewPager2.setCurrentItem(this.firstElementPosition, false)
}
Run Code Online (Sandbox Code Playgroud)

从字面上看,这不是无止境的,但从用户的角度来看,它是无限的,因为他永远不会到达边缘。的长度ViewPager2Int.MAX_VALUE,起始位置是Int.MAX_VALUE/2这样用户可以向前和向后滚动。


Raf*_*san 5

对于无限滚动,您不必自定义视图寻呼机。viewPager 适配器中的技巧。您可以在 getCount 覆盖方法中返回 Int.MAX 值。在InstantiateItem覆盖函数中,您可以使用item_position % item_size来获取实际的项目位置。下面给出了代码示例。

class AdsSliderAdapter(
private val bannerImageList: MutableList<SliderImagesItem>,
private val callback: SliderItemClickListener) :PagerAdapter() {

private var mContext: Context? = null
override fun instantiateItem(container: ViewGroup, position: Int): Any {
    mContext = container.context

    val view = LayoutInflater.from(container.context)
        .inflate(R.layout.item_ad_slider, container, false)

    val adImage: AppCompatImageView = view.ivAd
    mContext?.let {
        GlideApp.with(it).load(bannerImageList[position % bannerImageList.size].imageUrl)
            .into(adImage)
    }
    val viewPager = container as ViewPager
    viewPager.addView(view, 0)

    view.cardView.onClick { callback.onSliderImageClick(bannerImageList[position % bannerImageList.size]) }
    return view
}

override fun isViewFromObject(view: View, `object`: Any): Boolean {
    return view === `object`
}

override fun getCount(): Int {
    return if (bannerImageList.size > 0) {
        Int.MAX_VALUE
    } else {
        0
    }
}

override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
    val viewPager = container as ViewPager
    val view = `object` as View
    viewPager.removeView(view)
}

interface SliderItemClickListener {
    fun onSliderImageClick(item: SliderImagesItem)
}
Run Code Online (Sandbox Code Playgroud)

}