Recycler将侦听器onScrollStateChanged添加回调滚动状态“SCROLL_STATE_IDLE”一段不可忽略的延迟时间

时间:2018-05-17 09:58:06

标签: java android

  1. 像这样的xml代码:

    enter image description here

  2. 页面监听器代码如下:

       RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            Log.d("-------newState------->" + newState);
        }
    });
    
  3. 当我滑倒到顶部时,打印日志:

      

    [onScrollStateChanged()line:412] ------- newState -------> 1

         

    [onScrollStateChanged()line:412] ------- newState -------> 2

         

    [onScrollStateChanged()line:412] ------- newState -------> 0

    然而,几秒钟后,最后一行日志才会显示。这是第一个问题。第二个问题:CollapsingToolbarLayout和AppBarLayout之间的com.xxx.ExpadnTabLayout有点击事件,当我点击ExpandTabLayout视图时,它下面会有一个popwindow显示。因此,当“newState”参数的值为2时,上述情况会导致精神错乱视图。虽然页面是静态的,并且值不会及时更改为0。那么我能为这些问题做些什么。

    任何帮助将不胜感激!!!

1 个答案:

答案 0 :(得分:0)

解决方案只是覆盖HeaderBehavior类中的“onNestedPreScroll”方法,并在其中停止“mScroller”。下面的代码:(欢迎指出错误> _>

  <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        app:layout_behavior="com.xxx.android.ui.widgets.behavior.CustomBehavior"
        app:elevation="0dip">

CustomeBehavior.class:

  private void getParentScroller(Context context) {
    if (mScroller != null) return;
    mScroller = new OverScroller(context);
    try {
        Class<?> reflex_class = getClass().getSuperclass().getSuperclass();
        Field fieldScroller = reflex_class.getDeclaredField("mScroller");
        fieldScroller.setAccessible(true);
        fieldScroller.set(this, mScroller);
    } catch (Exception e) {
    }
  }

@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
    if (mScroller != null) {
        if (mScroller.computeScrollOffset()) {
            mScroller.abortAnimation();
        }
    }
    if (type == ViewCompat.TYPE_NON_TOUCH && getTopAndBottomOffset() == 0) {
        ViewCompat.stopNestedScroll(target, type);
    }
    super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
}