2015-01-14 9 views
11

Android'de RecyclerView kullanmaya başlıyorum. Bağdaştırıcım için dokunmatik dinleyiciyi uygulayana kadar işler iyi çalışıyor. Bu konuyla itibarenOnLongItemBu kategoridekiullüzüntüleyemiyorum

: Ben doğru childview için dinleyici uygulayabilir

https://stackoverflow.com/a/26826692/2923403

. Ancak, hem OnItemClick hem de OnItemLongClick'i uygulamak istiyorum, sonra sorun görünür. Her zaman aynı zamanda kovulurlar. OnItemClick ilk ve OnItemLongClick daha sonra işlevimi işe yaramaz hale getirir. İşte

(Fouad için yukarıdaki koduna dayalı, teşekkürler) benim özel dinleyicisi için kodudur:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

public static interface OnItemClickListener { 
    public boolean onItemClick(View view, int position); 

    public void onItemLongClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

      if (childView != null && mListener != null) { 
       mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView)); 
      } 
     } 

    }); 
} 

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

    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     mListener.onItemClick(childView, view.getChildPosition(childView)); 
     return true; 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
} 

Ve uygulanması için:

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { 
@Override 
public boolean onItemClick(View view, int position) { 
//This is fired 1st 
} 
@Override 
public void onItemLongClick(View view, int position) { 
//This comes later 
})); 

mı bunun için herhangi bir çözümü var ?

cevap

24

Özel adaptör uygulamanıza dinleyicileri ekleyebilirsiniz. başında

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

    public interface OnItemClickListener { 
     public void onItemClicked(int position); 
    } 

    public interface OnItemLongClickListener { 
     public boolean onItemLongClicked(int position); 
    } 

    private Fragment mFragment; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public View v; 

     public ViewHolder(View v) { 
      super(v); 
      this.v = v; 
     } 
    } 

    public RecyclerViewAdapter(Fragment fragment) { 
     mFragment = fragment; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     holder.v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mFragment.onItemClicked(position); 
      } 
     }); 
     holder.v.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       mFragment.onItemLongClicked(position); 
       return true; 
      } 
     }); 
    } 
    . . . 
} 

Not arayüzleri tanımı: Bu şey gibi olacak. Bu şekilde, işlem yapmak için onClick ve onLongClick etkinliklerini parçanıza aktarırsınız. Oldukça kullanışlı olan,

+0

Hi.It durumumda her iki olayın da aynı anda patlatıldığını görüyoruz – Souris

+0

Geridönüşümünüzden (engelli) onGünlük dinleyicileri kaldırdınız mı? Onlara ihtiyacın yok. Aktivitenizde veya parçanızda 'RecyclerViewAdapter.OnItemClickListener' ve' RecyclerViewAdapter.OnItemLongClickListener' öğelerini uygulayın ve ilgili arabirim yöntemlerini geçersiz kılın. –

+0

Teşekkürler. İşe yarıyor. Çözümü kabul ettim. : D – Souris