美文网首页Android知识Android技术知识Android进阶之旅
RecyclerView滚动到指定位置的一种姿势。

RecyclerView滚动到指定位置的一种姿势。

作者: JarvanMo | 来源:发表于2017-07-21 22:18 被阅读2050次

    其实这个问题没有什么难度了,下面的两种方式都可以实现,但是效果可能并不是我想要的。

    recyclerView.scrollToPosition(position);
    recyclerView.smoothScrollToPosition(position);
    

    因为我的效果是想要指定的position滑动到窗口最顶部,但实际效果却不是这样的。

    百度

    老规度,借助一下性无能的百度。
    答案出来了:

    
      /**
         * RecyclerView 移动到当前位置,
         *
         * @param manager  设置RecyclerView对应的manager
         * @param n  要跳转的位置
         */
        public static void MoveToPosition(LinearLayoutManager manager, int n) {
            manager.scrollToPositionWithOffset(n, 0);
            manager.setStackFromEnd(true);
        }
    

    也有这样的:

    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()); //滚动到顶部
          }    
      } 
     }
    });
    

    这个代码很多了,看看脑袋都大喽。

    我的方法

        LinearSmoothScroller smoothScroller = new LinearSmoothScroller(this){
    
            @Override
            protected int getVerticalSnapPreference() {
                return LinearSmoothScroller.SNAP_TO_START;
            }
        };
        smoothScroller.setTargetPosition(0);
        recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);
    

    关键在于 getVerticalSnapPreference()的返回值,共有三种:

     public static final int SNAP_TO_START = -1; 
     public static final int SNAP_TO_END = 1;
     public static final int SNAP_TO_ANY = 0;
    
    

    SNAP_TO_START使子视图的左侧或顶部与父视图的左侧或顶部对齐。
    SNAP_TO_END使子视图的右侧或底部与父视图的右侧面或底部对齐。
    SNAP_TO_ANY根据子视图的当前位置与父布局的关系,决定子视图是否从头到尾跟随。
    比如,如果子视图实际位于RecyclerView的左侧,SNAP_TO_ANY和SNAP_TO_START是没有
    差别的。
    默认值就是SNAP_TO_ANY啦。
    具体什么效果大家可以试试啦,本文只是抛砖引玉。
    结束,谢谢~~

    相关文章

      网友评论

        本文标题:RecyclerView滚动到指定位置的一种姿势。

        本文链接:https://www.haomeiwen.com/subject/zdqykxtx.html