滚,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位于当前界面的位置。
示例代码:

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

你可能感兴趣的:(滚,recyclerview,滚到指定位置)