【问题标题】:Check when smoothScrollToPosition has finished检查 smoothScrollToPosition 何时完成
【发布时间】:2018-07-10 09:10:32
【问题描述】:

我想检查smoothScrollToPosition 何时完成滚动回recyclerview 的第一项。我试过这样做,它只在 smoothScrollToPosition 仍在滚动时才有效:

recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,new RecyclerView.State(), 0);
if (!recyclerView.getLayoutManager().isSmoothScrolling()) {
    Log.d(TAG, "Scrolling has ended.");
} 

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    我使用onScrollStateChanged(RecyclerView recyclerView, int newState) 方法来跟踪滚动状态。启动滚动的方法如下:

    private void scrollToPosition(int position){
        recyclerView.removeOnScrollListener(onScrollListener);
        recyclerView.addOnScrollListener(onScrollListener);
        recyclerView.smoothScrollToPosition(position);
    }
    

    这里是监听器:

    RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
           @Override
           public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
               switch (newState) {
                   case SCROLL_STATE_IDLE:
                       //we reached the target position
                       recyclerView.removeOnScrollListener(this);
                       break;
               }
           }
       };
    

    所以,当 recyclerView 到达 SCROLL_STATE_IDLE 时,这意味着它已经完成了滚动。不要忘记在这个状态下移除监听器,这样它就不会在下一次滚动时触发。

    【讨论】:

    • 为什么要删除然后立即重新添加监听器?
    • RecyclerView.addOnScrollListener 只是在列表中添加监听器。所以,我想我们可能会多次添加相同的监听器,所以它会被复制。所以,如果从某个点击监听器调用 scrollToPosition,我们必须删除旧的 onScrollListener,以防它在 onScrollStateChanged 中没有被删除,因为所需的 SCROLL_STATE_IDLE还没有发生。
    • 目标位置难以获取,存储其他变量保存不好解决
    【解决方案2】:

    有一个监听器:

    https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener

    void onScrolled (RecyclerView recyclerView, 
                    int dx, 
                    int dy)
    

    RecyclerView 滚动时调用的回调方法。 这将在滚动完成后调用。

    【讨论】:

    • 这个方法在recyclerView滚动的时候被多次调用。
    猜你喜欢
    • 2011-12-17
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2023-03-22
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多