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位于当前界面的位置。示例代码:
作者:bogerLiu链接:http://www.jianshu.com/p/7c4203e8c0e6來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
示例代码:
-
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()); //滚动到顶部
-
}
-
}
-
}
-
});
作者:bogerLiu
链接:http://www.jianshu.com/p/7c4203e8c0e6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
@Override
public void clickPosition(int id) {
//通过TypeId 到商品集合里面查询制定typeId的商品数据de第一个条目的位置
int position = getGoodsPositionByTypeId(id);
final LinearLayoutManager manager = (LinearLayoutManager) mRightRecyclerview.getLayoutManager();
int fir = manager.findFirstVisibleItemPosition();
int end = manager.findLastVisibleItemPosition();
Log.e(TAG, "position" + position);
Log.e(TAG, "fir" + fir);
Log.e(TAG, "end" + end);
if (position <= fir) {//屏幕以外 上面
mRightRecyclerview.scrollToPosition(position);
Log.i(TAG, "position <= fir" + position);
} else if (position <= end) {//屏幕上面
int top = mRightRecyclerview.getChildAt(position - fir).getTop();
Log.e(TAG, "position <= end" + top);
mRightRecyclerview.scrollBy(0, top);
} else {//屏幕以外 下面
mRightRecyclerview.scrollToPosition(position); //先让当前view滚动到列表内
Log.e(TAG, "else " + position);
// move = true;
int n = manager.findFirstVisibleItemPosition();
if (n >= 0 && n < mRightRecyclerview.getChildCount()) {
mRightRecyclerview.scrollBy(0, mRightRecyclerview.getChildAt(n).getTop()); //滚动到顶部
Log.e(TAG, "onScrolled===" + mRightRecyclerview.getChildAt(n).getTop() + "n=" + n);
}
}
Log.e(TAG, "===================================");
}