2017-01-02 78 views
0

我正在使用RecyclerView以自定義佈局顯示這些CardView。我想要做的是檢測用戶何時單擊該播放按鈕,以及何時單擊CardView。目前我使用的是RecyclerView.OnItemTouchListener,但似乎無法得到我需要的所有活動(播放按鈕的點擊。)如何在RecyclerView中檢測嵌套視圖上的點擊?

Screenshot

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

private GestureDetector gestureDetector; 
private ClickListener clickListener; 

public interface ClickListener { 
    void onClick(View view, int position); 

    void onLongClick(View view, int position); 
} 

public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { 
    this.clickListener = clickListener; 
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && clickListener != null) { 
       clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child)); 
      } 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

    View child = rv.findChildViewUnder(e.getX(), e.getY()); 

    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
     clickListener.onClick(child, rv.getChildAdapterPosition(child)); 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 

}

此代碼只告訴當CardView被點擊時,我也想點擊播放按鈕。我是否應該在我的適配器類中設置onClick監聽器,儘管這看起來很糟糕?

謝謝你的時間。

+0

您應該創建自定義項目佈局和自定義適配器。在適配器中,您應該爲按鈕設置onclick。看看這個答案http://stackoverflow.com/a/30285361/4872155 –

+0

可能重複[處理按鈕點擊行內RecyclerView](http://stackoverflow.com/questions/30284067/handle-button-click-行內回收查看器) –

+0

這不是重複的,因爲我正在尋找一種解決方案,不涉及在適配器類中設置onClick偵聽器。雖然我擔心這將是唯一的解決方案,但它似乎比使用推薦的RecyclerView.OnItemTouchListener更不靈活。 –

回答

0

我一直希望找到一些與RecyclerView.OnItemTouchListener一起工作的東西,因爲它似乎是實現這一點的正確方法。最後,我認爲最好的方法是在適配器類中爲RecyclerView設置onClick監聽器(這是我將要做的。)

感謝您的幫助。

這是一位評論員建議的帖子,作爲我計劃做的替代方案。

Handle Button click inside a row in RecyclerView

0

我不知道這(因爲我在做相反的,點擊孩子單擊父),但 android:clickable="false" android:focusable="false" 可以幫助你:設置你的根以不可點擊/可聚焦,然後添加一個點擊監聽器在你的按鈕上,沒有任何攔截。

希望這會有所幫助。