Android 是否可以创建一个派生自LinearSmoothScroller的类,该类已添加属性以在其中一个重写的方法中使用其值
我希望有一个从LinearSmoothScroller类派生的类,在这个类中,我可以通过类构造函数传递滚动速度属性。我在下面有一个代码,它可以工作,并为测试添加了一些Android 是否可以创建一个派生自LinearSmoothScroller的类,该类已添加属性以在其中一个重写的方法中使用其值,android,inheritance,kotlin,Android,Inheritance,Kotlin,我希望有一个从LinearSmoothScroller类派生的类,在这个类中,我可以通过类构造函数传递滚动速度属性。我在下面有一个代码,它可以工作,并为测试添加了一些println() ScrollerManager类: class ScrollerManager( val context: Context, private var millisecondsPerInch: Float ) : LinearSmoothScroller(context) {
println()
ScrollerManager类:
class ScrollerManager(
val context: Context,
private var millisecondsPerInch: Float
) : LinearSmoothScroller(context) {
init {
println("init millisecsPerInch: $millisecondsPerInch, instance: $this")
}
fun printSpeed() {
println("printSpeed(): $millisecondsPerInch, instance: $this")
}
override fun getHorizontalSnapPreference(): Int {
return LinearSmoothScroller.SNAP_TO_START
}
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
println("calcSpeedPerPixel(..) millisecsPerInch: ${this.millisecondsPerInch}, instance: $this")
// Here I want to use millisecondsPerInch field value, instead of written value 30f:
return 30f / displayMetrics?.densityDpi!!
}
}
单击项目侦听器界面:
interface RecItemClickListener {
fun onClick(view: View, position: Int)
}
适配器。上下文、RecyclerView和itemList从Activity传递。
单击recyclerView项时,将在使用SmoothScroller的位置调用scrollToPosition方法
class AdvancedRecViewHoriAdapter(
val context: Context,
val recyclerView: RecyclerView,
val itemsList: List<String>
) : RecyclerView.Adapter<AdvancedRecViewHoriCustomViewHolder>() {
companion object {
var selectedPosition = RecyclerView.NO_POSITION
}
override fun getItemCount(): Int {
return itemsList.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
: AdvancedRecViewHoriCustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
// inflate layout from xml
val cellForRow = layoutInflater.inflate(
R.layout.rec_view_advanced_hori_row, parent, false)
return AdvancedRecViewHoriCustomViewHolder(cellForRow)
}
private fun scrollToPosition(position: Int) {
val smoothScroller = ScrollerManager(context, 30f)
smoothScroller.printSpeed()
smoothScroller.targetPosition = position
recyclerView.layoutManager.startSmoothScroll(smoothScroller)
}
override fun onBindViewHolder(holder: AdvancedRecViewHoriCustomViewHolder, position: Int) {
val itemName = itemsList[position]
itemView.rec_view_adv_hori_row_text_view_id.text = itemName
holder.itemClickListener = object : RecItemClickListener {
override fun onClick(view: View, position: Int) {
selectedPosition = position // Update layout position of clicked item.
scrollToPosition(position)
}
}
}
}
问题是,当我点击一个recyclerView项目时,我会得到这样的系统打印。正如我给出的建议,我已经检查并添加了实例的地址。但是,指纹来自相同的实例,所以它不能解决这个问题
I/System.out:
calcSpeedPerPixel(..) inchPerMilisecs: 0.0, instance: com.example.danielg.loginviewexercise.ScrollerManager@1c4f5c5
init inchPerMilisecs: 30.0, instance: com.example.danielg.loginviewexercise.ScrollerManager@1c4f5c5
printSpeed(): 30.0, instance: com.example.danielg.loginviewexercise.ScrollerManager@1c4f5c5
问题是:
为什么millisesperinch
没有在ScrollerManager类构造函数中传递该值,而其值是0.0
我做了一些研究,并研究了LinearSmoothScroller类的实现。可能问题在于calculateSpeedPerPixel
方法受到保护。我还考虑过重写毫秒/u英寸
属性的值,但它是final
从LinearSmoothScroller.java文件中列出:
private static final float MILLISECONDS_PER_INCH = 25f;
...
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
尝试检查打印是否来自传递给layoutmanager的同一实例,将$this
添加到打印中,并查看identity hashcode是否相等。@Pawel这是一个有趣的建议。谢谢我将添加代码和打印,然后是您的建议。不幸的是,来自相同实例的打印。
private static final float MILLISECONDS_PER_INCH = 25f;
...
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}