2

我有一個RecyclerView,我添加了可以在列表項上執行的不同操作。特別是,DragDropSwipeDismissDragDrop由長按啓動,SwipeDismiss由刷卡啓動。我必須留意滾動事件以阻止這些行爲的發生。滾動令人討厭,然後突然轉爲拖動。在我添加一個OnScrollListener來處理這個問題之前。CoordinatorLayout與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

這是一個很好的博客,但它不提供解決我的問題。協調員佈局是根視圖,正在攔截我的觸摸。那就是滑動和拖拽,而且我的工作很好。我需要解決滾動沒有傳遞給recyclerView。 –

+0

嗯,不,你沒有一切正常:否則你根本就沒有問題。你會有很多很容易的時間用'ItemTouchHandler'清除你的滑動/拖動代碼,它很好地適用於'CoordinatorLayout'和嵌套滾動。 – ianhanniballake

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