相关文章推荐
深情的水桶  ·  qt ...·  2 年前    · 
逃跑的椰子  ·  Error[Pe020]: ...·  3 年前    · 
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

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

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;
    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啦。
具体什么效果大家可以试试啦,本文只是抛砖引玉。
结束,谢谢~~