2016-01-11 43 views
1

我在我的應用程序中使用RecyclerView。我實現了這個帶有自定義項目的觸摸聽者在RecyclerView中的按鈕

Sliderd's Material Design Tutorial

我TouchListener描述是這樣的:

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

private GestureDetector gestureDetector; 
private ClickListener clickListener; 

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) { 
      Log.v(getClass().getName(), "onSingleTapUp " + e); 
      return true; 
      //return super.onSingleTapUp(e); 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && clickListener != null) { 
       clickListener.onLongClick(child, recyclerView.getChildPosition(child)); 
      } 
      Log.v(getClass().getName(), "onLongPress" + e); 
     } 
    }); 
    Log.v(getClass().getName(), "construtcor invoked"); 
} 

@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.getChildPosition(child)); 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
    Log.v(getClass().getName(), "onTouchEvent " + e); 
} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 
} 

現在,作爲用戶拉維是問here我想在每個添加一個按鈕回收者視圖的項目。但是如果我點擊這個按鈕,項目點擊偵聽器也會被觸發。我如何實現按鈕的點擊監聽器,而不會對項目本身產生任何副作用?

+0

我認爲在'onInterceptTouchEvent()'你可以做一些像'if(child instanceof Button){...}'只獲得'Button'點擊。否則,你可以在''onBindViewHolder''的'Adapter'中添加'OnClickListener',並用'holder.button.setOnClickListener(..)'' – yennsarah

回答

0

編輯:我認爲Extend a Child View's Touchable Area可以提供幫助。我會稍後嘗試添加一些關於RecyclerView的代碼片段。

下面的代碼片段執行以下操作:

  • 獲取parent view並在UI thread職位Runnable。這可以確保在調用getHitRect()方法之前,父母佈置其子女。
  • getHitRect()方法獲取父級座標中孩子的命中矩形(可觸摸區域)。
  • 查找ImageButton子視圖並調用getHitRect()以獲取小孩可觸摸區域的邊界。
  • 擴大命中矩形的邊界。 實例化TouchDelegate,傳入展開的命中矩形和ImageButton子視圖作爲參數。
  • 在父視圖上設置TouchDelegate,使觸摸委託範圍內的觸摸路由到子級。

原來,沒有到目前爲止任何有價值的信息:

我想在onInterceptTouchEvent()你可以做類似 如果(孩子的instanceof按鈕){...} 只得到了Button點擊。但是這看起來很糟糕。你也可以查看如果ID匹配:

if(child.getId() == R.id.myRvButton){...} 

否則,你可能在你的AdapteronBindViewHolder的東西,如holder.button.setOnClickListener(..)添加OnClickListener。但是如果你想要另一個Click Event如果用戶點擊該項目,你可以嘗試上述方法。

+0

'這樣的東西描述了三種不同的方法。好主意。但前兩個不起作用。該代碼不會運行到if語句的主體中。在第三種方法中,按鈕點擊和回收者視圖項目點擊被觸發。 – unlimited101

+0

好的,對不起,前2個不起作用,沒有想過通過這個。也許通過閱讀[this](http://developer.android.com/training/gestures/viewgroup.html),特別是最後一節會幫助你。我會編輯答案以獲取一些有價值的信息。 – yennsarah

相關問題