没有滚动时,不会触发RecyclerView onScrollStateChanged / onScrolled事件

时间:2015-10-07 11:29:27

标签: android scroll android-recyclerview

听起来不是问题,对吗?)让我解释用例。假设您想要为每个滚动事件结束动画/突出显示目标项:

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()方法,那么您实际上会得到通知。这种方法的问题是它在列表停止滚动之前稍微触发了¯\ _(ツ)_ /¯。

0 个答案:

没有答案