使用RecyclerView的CoordinatorLayout:onScroll

时间:2015-07-11 00:03:39

标签: android android-recyclerview onscrolllistener android-coordinatorlayout

我有一个RecyclerView,我在其中添加了可以对列表项执行的不同操作。特别是DragDropSwipeDismissDragDrop是通过长按启动的,SwipeDismiss是通过滑动启动的。我必须注意滚动事件以阻止这些动作发生。滚动然后突然切换到拖动是令人讨厌的。在我添加OnScrollListener来处理此问题之前。

这就是我之前所做的:

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    if(newState == RecyclerView.SCROLL_STATE_IDLE){
        drag.setCurrentAction(IDLE);
    } else {
        drag.setCurrentAction(SCROLL);
    }
}

不再有效

我最近添加了CoordinatorLayout for collapsable toolbars。现在向上滚动时,drag将不会设置为SCROLL,直到工具栏折叠为止。我试图创建自己的行为,但这将取代我正在使用的当前行为; @string/appbar_scrolling_view_behavior。这删除了我想要的工具栏行为,但无法通知我的drag州。

我尝试了什么:

@Override
public boolean onStartNestedScroll(CoordinatorLayout cl, CollapsingToolbarLayout child, View directTargetChild,
        View target, int nestedScrollAxes) {

    if (nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL) {
        if (drag.getCurrentAction().ordinal() < SCROLL.ordinal()) {
            /* No actions have started and we are scrolling. set the new action */
            drag.setCurrentAction(SCROLL);
        }
        return true;
    }
    return super.onStartNestedScroll(cl, child, directTargetChild, target, nestedScrollAxes);
}

@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, CollapsingToolbarLayout child, View target) {
    super.onStopNestedScroll(coordinatorLayout, child, target);
    if (drag.getCurrentAction() == SCROLL) {
        drag.setCurrentAction(INVALID);
    }
}

所以我的问题

如何在我的回收站视图中侦听CoordinatorLayout拦截的滚动更改?行为是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

您是否尝试添加touchEvent侦听器,然后停用父视图组持有者的拦截器事件?我认为让孩子回到你想要处理的任何触摸事件的控制。

    scrollView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
               // Disallow the touch request for parent scroll on touch of child view

                     v.getParent().requestDisallowInterceptTouchEvent(true);

                } else if (event.getAction() == MotionEvent.ACTION_UP) {

                      v.getParent().requestDisallowInterceptTouchEvent(false);
               }
          return false;
          }
       });

答案 1 :(得分:-1)

您应该使用ItemTouchHelper中详述的this blog post

它包含诸如

之类的方法
  • onMove(RecyclerView, ViewHolder, ViewHolder)
  • onSwiped(ViewHolder, int)

允许您实现拖放以及滑动以关闭而无需编写自定义行为或触摸事件处理。