滚动到RecyclerView中的项目,将其放置在屏幕中央

时间:2019-11-20 20:15:23

标签: android kotlin android-recyclerview

我想滚动到RecyclerView中的特定项目,但是使用LinearLayoutManager.scrollToPosition(position: Int),该项目有时在屏幕顶部,有时在底部。

我希望它滚动到该项目并将其放在屏幕中央。

我可以使用其他答案使用平滑滚动器来实现此目的,但是我经常想跳到列表的很远,因此等待平滑滚动完成是不可接受的。

1 个答案:

答案 0 :(得分:0)

我找到了使用平滑滚动器实现此目标的许多答案,但是如果您想在不进行平滑滚动的情况下实现此目标(例如,立即跳转较大的距离),则可以使用普通的LinearLayoutManager / GridLayoutManager通过计算补偿自己。

我继承了LinearLayoutManager的子类,以便我可以只使用scrollToPosition函数,并始终将其滚动到该位置并使其位于中心位置,但是如果愿意,可以每次使用带有手动偏移量的LinearLayoutManager的scrollToPositionWithOffset函数,

class CenterScrollLayoutManager(context: Context, orientation: Int, reverseLayout: Boolean): LinearLayoutManager(context, orientation, reverseLayout) {

    override fun scrollToPosition(position: Int) {

        //this will place the top of the item at the center of the screen
        val height = getApplicationContext().resources.displayMetrics.heightPixels
        val offset = height/2

        //if you know the item height, you can place the center of the item at the center of the screen
        //  by subtracting half the height of that item from the offset:
//        val height = getApplicationContext().resources.displayMetrics.heightPixels
//        //(say item is 40dp tall)
//        val itemHeight = 40F * getApplicationContext().resources.displayMetrics.scaledDensity
//        val offset = height/2 - itemHeight/2

        //depending on if you have a toolbar or other headers above the RecyclerView, 
        //  you may want to subtract their height as well:
//        val height = getApplicationContext().resources.displayMetrics.heightPixels
//        //(say item is 40dp tall):
//        val itemHeight = 40F * getApplicationContext().resources.displayMetrics.scaledDensity
//        //(say toolbar is 56dp tall, which is the default action bar height for portrait mode)
//        val toolbarHeight = 56F * getApplicationContext().resources.displayMetrics.scaledDensity
//        val offset = height/2 - itemHeight/2 - toolbarHeight

        //call scrollToPositionWithOffset with the desired offset
        super.scrollToPositionWithOffset(position, offset)
    }
}

然后,要使用它,您首先需要将其设置为RecyclerView的布局管理器,可能在OnCreate(如果在活动中)或OnViewCreated(如果在片段中)内:

yourRecyclerView.apply {
            adapter = yourRecyclerViewAdapter
            layoutManager = CenterScrollLayoutManager(context, LinearLayoutManager.VERTICAL, false)
        }

然后,只需滚动至所需位置,该项目应位于中间:

yourRecyclerView.scrollToPosition(desiredPosition)

这也适用于GridLayoutManager。