Android 是否可以创建一个派生自LinearSmoothScroller的类,该类已添加属性以在其中一个重写的方法中使用其值

Android 是否可以创建一个派生自LinearSmoothScroller的类,该类已添加属性以在其中一个重写的方法中使用其值,android,inheritance,kotlin,Android,Inheritance,Kotlin,我希望有一个从LinearSmoothScroller类派生的类,在这个类中,我可以通过类构造函数传递滚动速度属性。我在下面有一个代码,它可以工作,并为测试添加了一些println() ScrollerManager类: class ScrollerManager( val context: Context, private var millisecondsPerInch: Float ) : LinearSmoothScroller(context) {

我希望有一个从LinearSmoothScroller类派生的类,在这个类中,我可以通过类构造函数传递滚动速度属性。我在下面有一个代码,它可以工作,并为测试添加了一些
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;
}