java - smoothScrollTo(position) 滚动到底部而不是 RecyclerView 中的目标位置

标签 java android kotlin android-recyclerview

当我按下按钮时,Kotlin 中的垂直 RecyclerView(看起来像一个简单的列表)会整齐地滚动到下一个元素。 👍🏻 然而,当下一个元素不在屏幕上时(例如,因为同时用户用手势滚动到不同的位置),问题是这不再起作用。相反,它会自动滚动到 RecyclerView 的底部。

知道如何解决这个问题吗?我将不胜感激! 预先感谢您的努力。

我正在重写 SmoothScrollLinearLayoutManager:

class SmoothScrollLinearLayoutManager(private val mContext: Context, orientation: Int, reverseLayout: Boolean) : LinearLayoutManager(mContext, orientation, reverseLayout) {

    override fun smoothScrollToPosition(recyclerView: RecyclerView, state: RecyclerView.State?,
                                        position: Int) {
        val smoothScroller = object : TopSnappedSmoothScroller(recyclerView.context) {
            //This controls the direction in which smoothScroll looks for your view
            override fun computeScrollVectorForPosition(targetPosition: Int): PointF {
                return PointF(0f, 1f)
            }

            //This returns the milliseconds it takes to scroll one pixel.
            protected override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
                return MILLISECONDS_PER_INCH / displayMetrics.densityDpi
            }
        }
        smoothScroller.targetPosition = position
        Log.i("Target", smoothScroller.targetPosition.toString())
        startSmoothScroll(smoothScroller)
    }


    private open inner class TopSnappedSmoothScroller(context: Context) : LinearSmoothScroller(context) {

        override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
            return this@SmoothScrollLinearLayoutManager
                    .computeScrollVectorForPosition(targetPosition)
        }

        override fun getVerticalSnapPreference(): Int {
            return LinearSmoothScroller.SNAP_TO_START
        }
    }

    private open inner class CenterSnappedSmoothScroller(context: Context) : LinearSmoothScroller(context) {

        override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
            return this@SmoothScrollLinearLayoutManager
                    .computeScrollVectorForPosition(targetPosition)
        }

        override fun getVerticalSnapPreference(): Int {
            return LinearSmoothScroller.SNAP_TO_END
        }
    }

    // Scrolling speed
    companion object {
        private val MILLISECONDS_PER_INCH = 110f
    }
}

按钮触发此函数滚动到列表中的下一个元素(RecyclerView):

private fun fastForwardTapped() {

        // Update selected position in RecyclerView
            selectedPosition += 1

        recyclerView.smoothScrollToPosition(selectedPosition)
    }

最佳答案

这与我重写 LinearLayoutManager 的方式有关。

我最终使用了这个解决方案: https://stackoverflow.com/a/36784136/8400139

它有效。

关于java - smoothScrollTo(position) 滚动到底部而不是 RecyclerView 中的目标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57494934/

相关文章:

java - ORA-00933 : SQL command not properly ended in a query that runs fine in SQL developer

android - 从 Activity 启动 FragmentActivity

Android Webview 电话 : link ERR_UNKNOWN_URL_SCHEME

android - Jetpack Compose 惰性列性能

java - .NET 上没有的 Java/Ruby 等很酷的框架有哪些?

java - Media Recorder 在 Android 中启动失败,用于三星 Galaxy s3 的前置摄像头

android - 当我实现 OnClickListener 时,我的应用程序崩溃了。我需要解决什么问题?

Fragment 内的 Android 共享首选项不起作用 - Kotlin

kotlin - 如何使用 spy

java - 在随机访问文件中寻求实现