首页 > 解决方案 > 在 Android 的 Scroll 上使用 SnapHelper 时出现抖动/弹跳效果

问题描述

我已经尝试过 SnapHelper Linear 和 Pager 但是在这两种情况下,gif中显示的以下效果发生在向上滚动时

https://media4.giphy.com/media/CN0FsbuoNG9d9DhFqd/giphy.gif

我附加了一个线性布局管理器

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/oc_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
        
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

在班上

private fun stickyScroll(){
        val helper: SnapHelper = PagerSnapHelper()
        helper.attachToRecyclerView(binding?.ocList)
}

并且还尝试了此代码以在线性 Snap Helper 中获得类似的寻呼机效果

val snapHelper: LinearSnapHelper = object : LinearSnapHelper() {
            override fun findTargetSnapPosition(
                layoutManager: RecyclerView.LayoutManager,
                velocityX: Int,
                velocityY: Int
            ): Int {
                val centerView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
                val position = layoutManager.getPosition(centerView)
                var targetPosition = -1
                if (layoutManager.canScrollHorizontally()) {
                    targetPosition = if (velocityX < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                if (layoutManager.canScrollVertically()) {
                    targetPosition = if (velocityY < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                val firstItem = 0
                val lastItem = layoutManager.itemCount - 1
                targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem))
                return targetPosition
            }
        }

        snapHelper.attachToRecyclerView(binding?.ocList)

标签: androidandroid-recyclerviewscrollpagersnaphelper

解决方案


推荐阅读