听起来不是问题,对吗?)让我解释用例。假设您想要为每个滚动事件结束动画/突出显示目标项:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrollStateChanged(final RecyclerView recyclerView,final int newState){
super.onScrollStateChanged(recyclerView,newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) { // on scroll stop
blink();
}
}
}
...
recyclerView.scrollToPosition(targetPosition);
按预期工作,只要当前位置与目标位置不同,并且有实际滚动的内容。同样非常可能的是列表已经处于正确位置并且调用scrollToPosition()
无效,onScrollStateChanged()
未被触发,以及我们的动画逻辑。作为一种解决方法,我可以考虑这个问题:
final int firstVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
if (firstVisibleItemPosition == targetPosition){
blink();
} else {
[previous code block]
}
但它真的是最好的解决方案吗?在每次onScrollStop()
调用之后,无论视觉列表移动如何,我都可以自然地进行一致scrollToPosition()
回调,因为我无法预测屏幕上会发生什么(是否会移动,或不移动?)并尝试破解。我所知道的,作为API用户,scrollToPosition()
被调用了,我希望能够触发相应的回调。
有趣的事实:如果您延长RecyclerView.SmoothScroller
并覆盖onStop()
方法,那么您实际上会得到通知。这种方法的问题是它在列表停止滚动之前稍微触发了¯\ _(ツ)_ /¯。