2

У меня есть RecyclerView, где я добавил различные действия, которые могут выполняться в элементах списка. В частности, DragDrop и SwipeDismiss. DragDrop инициируется длинным нажатием, а SwipeDismiss инициируется путем прокрутки. Я должен следить за событиями прокрутки, чтобы заблокировать эти действия. Это раздражает прокрутка, после чего он внезапно переключился на перетаскивание. До этого я бы добавил OnScrollListener, чтобы справиться с этим.КоординаторLayout с RecyclerView: onScroll

Это то, что я делал раньше:

@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? Правильно ли поведение?

ответ

0

Вы должны использовать ItemTouchHelper, как указано в this blog post.

Он содержит методы, такие как

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

которые позволяют реализовать перетаскивание, а также салфетка распускать без написания пользовательского Поведения или сенсорных обработки событий.

+0

Это хороший блог, но он не предлагает решение моей проблемы. Расположение координатора - это корневой вид и перехватывает мои штрихи. И это было для Swiping и Dragging, и у меня есть те, кто работает отлично. Мне нужно разрешить прокрутку, не переданную в recyclerView. –

+0

Ну нет, у вас нет всех правильных действий: иначе у вас не было бы вопроса здесь вообще. У вас будет много, гораздо проще сэкономить время, которое у вас есть с помощью 'ItemTouchHandler', который отлично сочетается с' CoordinatorLayout' и вложенной прокруткой. – ianhanniballake

+0

Да, здесь есть вопрос, потому что у меня нет проблем с моим ударом и перетаскиванием. Как и мой вопрос, все это работало, прежде чем я добавил рушительную панель инструментов.Схема координатора перехватывает прокрутку, прежде чем она перейдет в режим recyclerview. Я не думаю, что изменения в ресайклере могут измениться, потому что в корневом представлении все сначала затрагивается. Это должно быть в плане координатора. –

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; 
      } 
     });