前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RecyclerView滚动到指定位置的一种姿势。

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

作者头像
JarvanMo
发布2018-09-06 15:01:13
5.5K0
发布2018-09-06 15:01:13
举报
文章被收录于专栏:JarvanMo的IT专栏

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

代码语言:javascript
复制
recyclerView.scrollToPosition(position);
recyclerView.smoothScrollToPosition(position);

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

百度

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

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

也有这样的:

代码语言:javascript
复制
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()); //滚动到顶部
      }    
  } 
 }
});

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

我的方法

代码语言:javascript
复制
    LinearSmoothScroller smoothScroller = new LinearSmoothScroller(this){

        @Override
        protected int getVerticalSnapPreference() {
            return LinearSmoothScroller.SNAP_TO_START;
        }
    };

    recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);

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

代码语言:javascript
复制
 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啦。 具体什么效果大家可以试试啦,本文只是抛砖引玉。 结束,谢谢~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.07.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 百度
  • 我的方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档