我想滚动到RecyclerView中的特定项目,但是使用LinearLayoutManager.scrollToPosition(position: Int)
,该项目有时在屏幕顶部,有时在底部。
我希望它滚动到该项目并将其放在屏幕中央。
我可以使用其他答案使用平滑滚动器来实现此目的,但是我经常想跳到列表的很远,因此等待平滑滚动完成是不可接受的。
答案 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。