需求
城市列表快速定位:通过右边的地区字母快速导航到特定位置
通讯录的快速定位
分析思路
网上查看的文章说:分三种情况,即屏幕上方、屏幕中、屏幕下方;分别处理代码逻辑;
实际分析后发现完全可以使用比较简单的方式实现:
默认API
RecyclerView 提供了3种方法用于滑动到特定位置的API
API | 区别 |
---|---|
scrollBy(int x, int y) |
根据x、y轴的距离,滑动 |
smoothScrollToPosition(int position) |
平滑滚动到特定 position |
scrollToPosition(int position) |
滚动到特定position |
但是通过具体代码的实践:均不能达到预期效果
scrollBy()
方法可以通计算 child.getTop() 获得其需要滑动的距离,但是如果 child 在屏幕之外,需要的 child 未创建,无法获得scrollToPosition(int position)
、smoothScrollToPosition(int position)
方法可以通过 position 滑动到特定下标,但是有个特点:
- position < firstViewItemPosition,则列表向下滚动 目标 position 滚动到顶部位置
- firstVisibleItemPosition < position < lastVisibleItemPosition :列表不会滚动
- position > lastVisibleItemPosition : 列表向上滚动, 目标position 滚动到屏幕底部位置
可见均不能达到我们的预期;
那我们去分析一下 smoothScrollToPosition() 的具体实现,看下我们是否可以干预一下其滚动规则
源码分析
// RecyclerView.java
public void smoothScrollToPosition(int position) {