背景:
需求中有一个详情页添加悬浮锚点条,要求滚动到不同的item,对应锚点高亮,点击锚点滚动到指定位置。
实现及问题:
监听滚动过程使锚点高亮并不难实现,问题在于点击锚点滚动到指定位置;
因为项目结构使用的listview,自然想到了listview.smoothScrollToPositionFromTop(int pos, int offset);
因为在顶部有一个titleBar渐变的浮层,所以使用带有offset的重载方法。但这个方法存在问题,就是滚动定位不准确。listview的setSelectionFromTop(int pos, int offset)这个方法很准确,但是没有滚动效果(很突兀)。从google也找了最优的解决方案,就是监听listview的ScrollState,在滚动停止的第一时间调用setSelectionFromTop,最后一闪而过的短距离突兀可以忽略。但是在条目特别复杂(比如我们的详情页)极端情况还是会出现不准确的问题。
无奈只好使用RecyclerView重构。RecyclerView滚动方法:
rv.smoothScrollToPosition(int pos):没有offeset参数,因为我要考虑titleBar的高度。
rv.smoothScrollBy(int dx, int dy):存在横向偏移量,但是没有position位置。
recyclerView的layoutManger还存在一个方法:
linearLayout