首页 > 解决方案 > Recyclerview 将项目滚动到顶部并为内部视图的大小滚动更多

问题描述

我有一个带有自定义 LinearLayoutManager 的 recyclerview,它使我能够滚动到所选项目并将该项目捕捉到 recyclerview 的开头。然而,这些项目被划分为类别,每个类别中的第一个项目都有一个标题文本视图。当平滑滚动发生时,我想滚动过去标题。基本上这是我得到的。标题只是项目中的文本视图,并且仅当项目位于类别中的第一个时才可见。

而不是看到这个;

#HeaderForItem1
##ITEM1
##ITEM2
#HeaderForItem3
###ITEM3
###ITEM4
###ITEM5

我也想滚动过去的标题并看到这个;当我滚动到 ITEM1

##ITEM1
##ITEM2
#HeaderForItem3
###ITEM3
###ITEM4
###ITEM5

我尝试在 customlayoutmanager 的 onLayoutComplete 方法中获取所有视图并动态查找标题高度。我设法得到但无法添加到滚动

这是我的自定义布局管理器

internal class LinearLayoutManagerWithSmoothScroller : LinearLayoutManager {

    private var offset = 0
    constructor(context: Context?) : super(
        context,
        VERTICAL,
        false
    ) {
    }

    // map of child adapter position to its height.
    private val childSizesMap = mutableMapOf<Int, Int>()

    override fun onLayoutCompleted(state: State?) {
        super.onLayoutCompleted(state)
        val view = getChildAt(0) as LinearLayout
        val v = view.getChildAt(0)
        offset = v.height
    }

    override fun smoothScrollToPosition(
        recyclerView: RecyclerView, state: RecyclerView.State,
        position: Int
    ) {
        val smoothScroller: SmoothScroller = TopSnappedSmoothScroller(recyclerView.context)
        smoothScroller.targetPosition = position
        startSmoothScroll(smoothScroller)
    }

    private inner class TopSnappedSmoothScroller(context: Context?) :
        LinearSmoothScroller(context) {
        override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
            return this@LinearLayoutManagerWithSmoothScroller
                .computeScrollVectorForPosition(targetPosition)
        }

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

我基本上从活动中调用 smoothScrollToPosition(position) 。

你们能指导我如何进行吗?

提前致谢。

标签: androidkotlinandroid-recyclerviewsmooth-scrolling

解决方案


推荐阅读