2014-12-30 27 views

cevap

4

Bunu yapmak için RecyclerView alt sınıfını ve dispatchTouchEvent() yöntemini geçersiz kılabilirsiniz. findChildViewUnder() yöntemini kullanarak, çocuk Görünümlerinin dışında bir dokunma olayı olup olmadığını belirleyebilir ve eğer varsa bir dinleyiciye bildirmek için bir interface kullanın. Aşağıdaki örnekte, OnNoChildClickListenerinterface, bu işlevselliği sağlar.

public class TouchyRecyclerView extends RecyclerView 
{ 
    // Depending on how you're creating this View, 
    // you might need to specify additional constructors. 
    public TouchyRecyclerView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    private OnNoChildClickListener listener; 
    public interface OnNoChildClickListener 
    { 
     public void onNoChildClick(); 
    } 

    public void setOnNoChildClickListener(OnNoChildClickListener listener) 
    { 
     this.listener = listener; 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) 
    { 
     // The findChildViewUnder() method returns null if the touch event 
     // occurs outside of a child View. 
     // Change the MotionEvent action as needed. Here we use ACTION_DOWN 
     // as a simple, naive indication of a click. 
     if (event.getAction() == MotionEvent.ACTION_DOWN 
      && findChildViewUnder(event.getX(), event.getY()) == null) 
     { 
      if (listener != null) 
      { 
       listener.onNoChildClick(); 
      } 
     } 
     return super.dispatchTouchEvent(event); 
    } 
} 

Not: Bu my answer hereGridView ilişkin gelen RecyclerView için uyarlanmıştır. Yorumlarınız

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
    if (motionEvent.getAction() != MotionEvent.ACTION_UP) { 
     return false; 
    } 
    View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); 
    if (child != null) { 
     // tapped on child 
     return false; 
    } else { 
     // Tap occured outside all child-views. 
     // do something 
     return true; 
    } 
    } 

    @Override 
    public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
    } 
}); 
+1

Çok teşekkür ederim! FindChildViewUnder (..) ile recyclerView.addOnItemTouchListener kullanarak bitti. – Omar

+0

@Omar Ah! Çok iyi! Kendimi RecyclerView ile tanıştım ve henüz bu arayüzden haberdar değildim. Bilgi için teşekkürler! Bunun için bir cevap oluşturmanız gerekir. Benden bir not alacaksın. –

7

sadece bir TouchListener ayarlamanız gerekir RecyclerView gibi yukarıda gösterilen:

categoryTable.setAdapter(new CatgoriesAdapter(categories.getWrappedList())); 
    categoryTable.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN 
        && categoryTable.findChildViewUnder(event.getX(), event.getY()) == null) 
      { 
       // Touch outside items here, you do whatever you want 
       HideCategoryMenu(); 
      } 
      return false; 
     } 
    }); 
+0

Ayrıca MotionEvent.getAction() == ACTION_UP seçeneğini de işaretlemelisiniz, aksi takdirde 2 tıklama olayı gerçekleşir. –

+0

Teşekkürler @ greg-ennis. Kodu güncelledim. –

+0

Bu kabul edilen cevap olmalı. Ayrıca, 'MotionEvent.ACTION_UP' bölümünün altında 'dönüş' yerine 'geri dönüş' olmalıdır. –

1

belirtildiği gibi

2

driss-Bounouar cevabı neredeyse bu önleyecektir sağ rağmen @ Kullanıcı, geri dönüştürücü görünümünü aşağıdan aşağıya kaydırırken, işleminizin gerçekleşmesine neden olur. Aşağı olayı kaydettiğimiz ve koordinatların fazla değişmemiş olması durumunda yukarı olayı kontrol ettiğimiz küçük bir değişiklikle, etkinliği başlatınız.

private MotionEvent lastRecyclerViewDownTouchEvent; 
myRecyclerView.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         if (event.getAction() == MotionEvent.ACTION_DOWN && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null) { 
          lastRecyclerViewDownTouchEvent = event; 
         } else if (event.getAction() == MotionEvent.ACTION_UP && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null 
           && lastRecyclerViewDownTouchEvent != null) { 
          // Check to see if it was a tap or a swipe 
          float xDelta = Math.abs(lastRecyclerViewDownTouchEvent.getX() - event.getX()); 
          float yDelta = Math.abs(lastRecyclerViewDownTouchEvent.getY() - event.getY()); 
          if (xDelta < 30 && yDelta < 30) { 
           // Do action 
          } 
          lastRecyclerViewDownTouchEvent = null; 
         } 
         return false; 
        } 
       }); 
İlgili konular