以前實(shí)現(xiàn)RecyclerView滑動(dòng)到具體position是通過(guò)《RecyclerView定位到具體position》這篇文章中的方法來(lái)實(shí)現(xiàn)。
這種方法不是很優(yōu)雅,因?yàn)槿绻ㄎ坏膒osition在最后一個(gè)可見(jiàn)項(xiàng)之后,就會(huì)出現(xiàn)滑動(dòng)一下再滑動(dòng)一下的現(xiàn)象涌萤,不是很連貫统扳。
下面介紹一種更優(yōu)雅的實(shí)現(xiàn)方式捍歪。
這種方案是通過(guò)SDK提供的LinearSmoothScroller來(lái)實(shí)現(xiàn)的。
val smoothScroller = object : LinearSmoothScroller(this) {
override fun getVerticalSnapPreference(): Int {
return LinearSmoothScroller.SNAP_TO_START
}
}
首先創(chuàng)建一個(gè)LinearSmoothScroller恨狈。重寫(xiě)getVerticalSnapPreference()返回SNAP_TO_START疏哗。
SNAP_TO_START的意思是指需要定位的position那個(gè)View的top和left和父布局(RecyclerView)的top和left對(duì)齊,也就是需要定位的position那個(gè)View出現(xiàn)在第一個(gè)可見(jiàn)位置禾怠。
同理返奉,SNAP_TO_END的意思是指需要定位的position那個(gè)View出現(xiàn)在最后一個(gè)可見(jiàn)位置。
因?yàn)槲覀冃枰獙osition的View出現(xiàn)在第一個(gè)可見(jiàn)位置吗氏,所以getVerticalSnapPreference()方法我們返回SNAP_TO_START芽偏。
在需要跳轉(zhuǎn)的地方,我們調(diào)用下面代碼即可:
smoothScroller.targetPosition = position
recycler.layoutManager.startSmoothScroll(smoothScroller)
這種方案相比上面一種代碼精簡(jiǎn)了不少弦讽,而且那種“滑動(dòng)一下再滑動(dòng)一下的現(xiàn)象”的現(xiàn)象也不存在污尉。
如果覺(jué)得默認(rèn)滑動(dòng)速度比較突兀不夠流暢的話,我們還可以將其的滑動(dòng)速度調(diào)慢一點(diǎn)往产,讓其滑動(dòng)更平緩被碗。重寫(xiě)LinearSmoothScroller的calculateSpeedPerPixel方法即可。
val smoothScroller = object : LinearSmoothScroller(this) {
override fun getVerticalSnapPreference(): Int {
return LinearSmoothScroller.SNAP_TO_START
}
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
return 40F / displayMetrics.densityDpi
}
}
calculateSpeedPerPixel的方法返回值是滑動(dòng)每個(gè)像素所需要的時(shí)間(毫秒)仿村,默認(rèn)是25F / displayMetrics.densityDpi锐朴。如果需要調(diào)慢一點(diǎn)可將這個(gè)值調(diào)大一點(diǎn)“遥可以根據(jù)實(shí)際體驗(yàn)焚志,設(shè)置一個(gè)合適的值衣迷。