作者:bogerLiu 链接:http://www.jianshu.com/p/7c4203e8c0e6 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。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()); //滚动到顶部 } } } });
作者: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, "==================================="); }
recyclerview,滚到指定位置
最新推荐文章于 2024-07-23 14:13:58 发布