CenterLinearLayoutManager
package com.lib.base.widget
import android.content.Context
import android.util.AttributeSet
import android.util.DisplayMetrics
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.Utils
class CenterLinearLayoutManager: LinearLayoutManager {
constructor(context: Context):super(context)
constructor(context: Context,orientation:Int,reverseLayout:Boolean) : super(context,orientation,reverseLayout)
constructor(context: Context,attrs:AttributeSet ,defStyleAttr:Int,defStyleRes:Int) : super(context,attrs,defStyleAttr,defStyleRes)
override fun smoothScrollToPosition(recyclerView: RecyclerView?, state: RecyclerView.State?, position: Int) {
if (position < 0) return
val smoothScroller = recyclerView?.context?.let { CenterSmoothScroller(it) }
smoothScroller?.targetPosition = position
startSmoothScroll(smoothScroller)
}
}
class CenterSmoothScroller(context: Context) : LinearSmoothScroller(context){
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
return 300f / Utils.getApp().resources.displayMetrics.densityDpi
}
override fun calculateDtToFit(viewStart: Int, viewEnd: Int, boxStart: Int, boxEnd: Int, snapPreference: Int): Int {
return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2)
}
}
class SmoothLinearLayoutManager : LinearLayoutManager{
constructor(context: Context):super(context)
constructor(context: Context,orientation:Int,reverseLayout:Boolean) : super(context,orientation,reverseLayout)
constructor(context: Context,attrs:AttributeSet ,defStyleAttr:Int,defStyleRes:Int) : super(context,attrs,defStyleAttr,defStyleRes)
override fun smoothScrollToPosition(recyclerView: RecyclerView?, state: RecyclerView.State?, position: Int) {
recyclerView?.context?.let {
val linearSmoothScroller = object : LinearSmoothScroller(it) {
protected override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
return 0.2f
}
}
linearSmoothScroller.targetPosition = position
startSmoothScroll(linearSmoothScroller)
}
}
}
setOnItemClickListener --> rv.smoothScrollToPosition(p)
adapter.setOnItemClickListener { ad, v, p ->
rv.smoothScrollToPosition(p)
}