Android 工作记录 CenterLinearLayoutManager Adapter 点击的时候 item居中

148 阅读1分钟

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  
  
  
/**  
* 点击 可以居中 再Adapter 点击的时候 调用 sortRcyclerView.smoothScrollToPosition(position) 就行  
*/  
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  
}  
//点击 item 自定居中  
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)  
}