Recyclerview,滚到指定位置

 
 

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, "===================================");
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值