2015-01-14 11 views
11

मैं एंड्रॉइड में रीसाइक्लर व्यू का उपयोग शुरू कर रहा हूं। जब तक मैं अपने एडाप्टर के लिए टच श्रोता लागू नहीं करता तब तक चीजें ठीक काम करती हैं।OnLongItem RecyclerView पर क्लिक करें

इस विषय से:

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

मैं सही ढंग से childview के लिए श्रोता को लागू कर सकते हैं। हालांकि, मैं OnItemClick और OnItemLongClick दोनों को कार्यान्वित करना चाहता हूं, फिर समस्या दिखाई देगी। उन्हें हमेशा एक ही समय में निकाल दिया जाता है। OnItem पहले क्लिक करें और OnItemLong बाद में क्लिक करें, जो मेरे कार्य को बेकार प्रदान करता है।

यहाँ (फौद के लिए ऊपर कोड के आधार पर, धन्यवाद) कस्टम श्रोता के लिए मेरे कोड है:

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) { 
} 

और कार्यान्वयन के लिए:

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

क्या आप उस के लिए किसी भी समाधान है ?

उत्तर

24

आप अपने कस्टम एडाप्टर कार्यान्वयन में श्रोताओं को जोड़ सकते हैं। यह कुछ ऐसा होगा:

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

नोट शुरुआत में परिभाषा परिभाषित करता है। इस तरह आप हैंडलिंग के लिए अपने टुकड़े पर क्लिक करें और ऑन लाइन क्लिक करें। बहुत अधिक सुविधाजनक, आप जानते हैं

+0

नमस्ते। ऐसा लगता है कि दोनों घटनाएं अभी भी मेरे मामले में एक ही समय में निकाल दी गई हैं – Souris

+0

क्या आपने अपने रीसायकल दृश्य से टच श्रोताओं को हटा दिया (अक्षम) किया? आपको उनकी आवश्यकता नहीं है। बस अपनी गतिविधि या खंड में 'RecyclerViewAdapter.OnItemClickListener' और' RecyclerViewAdapter.OnItemLongClickListener' को लागू करें, और संबंधित इंटरफेस विधियों को ओवरराइड करें –

+0

धन्यवाद। यह काम करता हैं। मैंने समाधान स्वीकार कर लिया। : डी – Souris

संबंधित मुद्दे