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, "===================================");
    }

猜你喜欢

转载自blog.csdn.net/xlwang9090/article/details/80843482
今日推荐