viewpage 做無限滑動(dòng),大家都知道的一種偽無限方法洒试,就不贅述了硼莽。感覺不太好庶溶,對(duì)性能也會(huì)有影響。往左滑動(dòng)還要計(jì)算中間值......
這里簡(jiǎn)單說一下另外一種方法懂鸵,原理就是 注冊(cè) registerOnPageChangeCallback 在回調(diào)中 通過設(shè)置 setCurrentItem偏螺。步驟如下:
1.加工數(shù)據(jù)源
例如真實(shí)的數(shù)據(jù)源為 1 2 3 4 5 ,那么在設(shè)置給adapter前 改造成 5 1 2 3 4 5 1匆光,就是第一項(xiàng)添加最后一個(gè)數(shù)據(jù)套像,最后一項(xiàng)添加第一個(gè)數(shù)據(jù)。
2.設(shè)置viewpage啟動(dòng)項(xiàng)
假設(shè)我們初始化時(shí)顯示第一項(xiàng)數(shù)據(jù)殴穴。那么就設(shè)置 setCurrentItem 為1
val list :List<String> = listOf("我是第5頁(yè)","我是第一頁(yè)","我是第二頁(yè)","我是第三頁(yè)","我是第四頁(yè)","我是第5頁(yè)","我是第一頁(yè)")
binding.vp2.adapter = MyAdapter(list)
binding.vp2.setCurrentItem(1,false)
3.注冊(cè)滑動(dòng)監(jiān)聽
通過 registerOnPageChangeCallback 在 onPageSelected 中進(jìn)行處理凉夯,代碼如下,一看就明白了采幌。由于源數(shù)據(jù)首位各添加了最后一項(xiàng)及第一項(xiàng)數(shù)據(jù)劲够,保證向左向右滑動(dòng)到邊界時(shí)可以繼續(xù)滑動(dòng)。當(dāng)滑動(dòng)到第0頁(yè)或最后一頁(yè)時(shí)休傍,做頁(yè)面切換征绎。
override fun onPageSelected(position: Int) {
Log.e("111111","onPageSelected-1: pos:$position")
if(currentPos == 0){
binding.vp2.setCurrentItem(list.size - 2,false)
}
if(currentPos == list.size -1){
binding.vp2.setCurrentItem(1,false)
}
}
4.細(xì)節(jié)處理
做到第三步時(shí) 基本就實(shí)現(xiàn)了我們的需求,但是會(huì)有個(gè)問題 onPageSelected事件是滑動(dòng)選擇頁(yè)面之后,而實(shí)際上頁(yè)面切換后后人柿,還會(huì)一部分的滑動(dòng)動(dòng)畫柴墩。這個(gè)時(shí)候進(jìn)行setCurrentItem,會(huì)導(dǎo)致頁(yè)面這部分動(dòng)畫丟失凫岖。解決辦法看另一個(gè)回調(diào)方法:onPageScrollStateChanged
此時(shí)需要將 當(dāng)前滑動(dòng)的頁(yè)號(hào)記錄下來江咳。調(diào)整一下邏輯:
var currentPos = 1
binding.vp2.registerOnPageChangeCallback (object : OnPageChangeCallback(){
override fun onPageSelected(position: Int) {
currentPos = position
Log.e("111111","onPageSelected-1: pos:$position")
}
override fun onPageScrollStateChanged(state: Int) {
Log.e("111111","onPageScrollStateChanged-3: state:$state")
if(state == 0){
if(currentPos == 0){
binding.vp2.setCurrentItem(list.size - 2,false)
}
if(currentPos == list.size -1){
binding.vp2.setCurrentItem(1,false)
}
}
}
})
onPageScrollStateChanged 中的 state = 0 代表此時(shí)動(dòng)畫已經(jīng)結(jié)束,那么在這個(gè)時(shí)候做setCurrentItem就最適合不過啦哥放。是不是更絲滑了些呢!!!!
最后編輯于 :2022.12.10 18:59:54
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者