nik*_*har 4 java android android-viewpager2
我们如何在 ViewPager2 中实现无限滚动
因为OnPageChangeListener()在这个寻呼机中没有。但是setPageTransformer()每当我们更改页面时,都会有Listener 获取回调。
因此,viewpager2 问题的任何解决方案
注意:我正在为 viewpager2 使用 recyclerview 适配器
第 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)
从字面上看,这不是无止境的,但从用户的角度来看,它是无限的,因为他永远不会到达边缘。的长度ViewPager2是Int.MAX_VALUE,起始位置是Int.MAX_VALUE/2这样用户可以向前和向后滚动。
对于无限滚动,您不必自定义视图寻呼机。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)
}
| 归档时间: |
|
| 查看次数: |
4661 次 |
| 最近记录: |