5

我有一个 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。现在向上滚动时,在工具栏折叠之前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?行为是正确的方式吗?

4

2 回答 2

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;
          }
       });
于 2016-03-21T14:23:36.087 回答
-1

您应该改用ItemTouchHelper,如本博文中所述。

它包含诸如

  • onMove(RecyclerView, ViewHolder, ViewHolder)
  • onSwiped(ViewHolder, int)

它允许您在不编写自定义行为或触摸事件处理的情况下实现拖放以及滑动关闭。

于 2015-07-11T01:47:00.827 回答