Android 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來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

示例代码:

 
  1. final LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();

  2. int fir = manager.findFirstVisibleItemPosition();

  3. int end = manager.findLastVisibleItemPosition();

  4. final int p = Integer.parseInt(string);

  5. if (p <= fir) {

  6. recyclerView.scrollToPosition(p);

  7. } else if (p <= end) {

  8. int top = recyclerView.getChildAt(p - fir).getTop();

  9. recyclerView.scrollBy(0, top);

  10. } else {

  11. recyclerView.scrollToPosition(p); //先让当前view滚动到列表内

  12. move = true;

  13. }

  14. recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()

  15. {

  16. @Override

  17. public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

  18. super.onScrolled(recyclerView, dx, dy);

  19. if (move) {

  20. move = false;

  21. int n = p - manager.findFirstVisibleItemPosition();

  22. if (n >= 0 && n < recyclerView.getChildCount()) {

  23. recyclerView.scrollBy(0, recyclerView.getChildAt(n).getTop()); //滚动到顶部

  24. }

  25. }

  26. }

  27. });

 


作者: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, "===================================");
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值