-
RecyclerView指定item滚动顶部
对于recyclerview滚动大家知道有scrollTo,scrollBy这种类似的方法。
但是大家有没有发现,当让recycleview滚动到某一位置会出现如下两种情况,
1:对于recyclerView滚动到某个position位置,当这个position位置不在当前界面内,recyclerView会滚动到当前position位置。
2:如果这个position已经在这个界面内显示,recyclerView是不会进行滚动到当前位置。对于这种问题,就需要用recyclerView的scrollBy();函数进行距离滚动,通过recyclerView.getChildAt(position).getTop()。获取到当前界面内该View距离顶部的距离,值得注意的是,recyclerView.getChildAt()里面的参数,是当前界面中view的位置,并不是recyclerView整个viewList中的数据的位置,所以求得这个view位于界面中的位置,需要通过用整个数据项的位置减去界面中第一个view的位置,就是这个view位于当前界面的位置。
示例代码:
final LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int fir = manager.findFirstVisibleItemPosition();
int end = manager.findLastVisibleItemPosition();
final int p = Integer.parseInt(string);
if (p <= fir) {
recyclerView.scrollToPosition(p);
} else if (p <= end) {
int top = recyclerView.getChildAt(p - fir).getTop();
recyclerView.scrollBy(0, top);
} else {
recyclerView.scrollToPosition(p); //先让当前view滚动到列表内
move = true;
}
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
{
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (move) {
move = false;
int n = p - manager.findFirstVisibleItemPosition();
if (n >= 0 && n < recyclerView.getChildCount()) {
recyclerView.scrollBy(0, recyclerView.getChildAt(n).getTop()); //滚动到顶部
}
}
}
});```