在RecyclerView中,我们知道有一个方法scrollToPosition(position)或者smoothScrollToPosition(position)即可让RecyclerView将指定的item滚动到手机屏幕显示的第一项位置。但是,当该item已经显示在手机屏幕上时,我们调用该方法竟然无效。那只能看有没有其他方法可以实现呢?发现还真有scrollTo(x, y)跟scrollBy(x, y)。其中第一个方法是绝对坐标,滚动到某个指定的坐标;第二个方法是相对坐标,滚动了多少x、y距离,是相对当前位置而言的。虽然处理起来比较麻烦,每次指定都得计算,但毕竟能实现我们想要的效果,这就可以让RecyclerView随心所欲的滚动了。下面是该效果实现的核心方法:
private void moveToPosition(int position){
LinearLayoutManager layoutManager = (LinearLayoutManager) listView.getLayoutManager();
//屏幕上当前显示的第一项item的索引
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
//屏幕上当前显示的最后一项item的索引
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
if (position < firstVisibleItemPosition || position > lastVisibleItemPosition){
listView.scrollToPosition(position);
}else {
int top = listView.getChildAt(position - firstVisibleItemPosition).getTop();
listView.scrollBy(0, top);
}
}
没错,虽然看起来实现思路挺麻烦,但实际逻辑也挺简单的。OK,现在就给我滚动吧RecyclerView!!!

GIF.gif