2014-11-12 14 views
19

पर क्लिक करें यह RecyclerView को लागू करने का मेरा पहला प्रयास है। मैंने यूआई तत्वों (बटन) पर क्लिक घटनाओं को संभालने के लिए Adapter और ViewHolder कक्षा के बीच Callback इंटरफ़ेस लागू किया है। मुझे ViewHolder का संदर्भ प्राप्त करने में समस्याएं आ रही हैं, जिसमें क्लिक हुआ था। मैं सूची में पहले आइटम के लिए Button पर क्लिक कर सकता हूं, हालांकि जो क्रिया मैंने परिभाषित की है, वह मेरे रीसाइक्लिंग व्यू में अंतिम viewholder पर किया गया है। आखिरकार मैंने अपने इंटरफ़ेस के माध्यम से स्थिति को पारित करने के लिए पता लगाया, लेकिन मैं समझने के लिए संघर्ष कर रहा हूं कि उस दर्शक को संदर्भ कैसे प्राप्त करें।रीसाइक्लर व्यू पर व्यूहोल्डर को संदर्भ प्राप्त करना

public class RoomAdapter extends RecyclerView.Adapter<RoomAdapter.RoomViewHolder> 
{ 
    List<Room> mRooms; 
    public RoomAdapter(List<Room> rooms) { 
     mRooms = rooms; 
    } 

    @Override 
    public RoomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     final View viewItem = LayoutInflater 
       .from(viewGroup.getContext()) 
       .inflate(R.layout.room_rv_item,viewGroup,false); 
     return vh = new RoomViewHolder(viewItem,new IRoomViewClick() { 
      @Override 
      public void editname(int pos) { 

      } 
     }); 
    } 

    @Override 
    public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) { 
     Room r = getItem(i); 
     roomViewHolder.label.setText(r.name); 


    } 
    public Room getItem(int position) 
    { 
     return mRooms.get(position); 
    } 
    @Override 
    public long getItemId(int position) { 
     return mRooms.get(position).getId(); 
    } 

    @Override 
    public int getItemCount() { 
     return mRooms.size(); 
    } 

    public static class RoomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
    { 
     TextView label; 
     Button editBtn; 
     LinearLayout labelView; 
     Button saveBtn; 
     Button deleteBtn; 
     EditText editNameET; 
     IRoomViewClick mListener; 
     public RoomViewHolder(View itemView, IRoomViewClick listener) { 
      super(itemView); 
      labelView = (LinearLayout) itemView.findViewById(R.id.labelview); 
      mListener = listener; 
      editBtn =(Button) itemView.findViewById(R.id.editbtn); 
      editBtn.setOnClickListener(this); 
      label = (TextView) itemView.findViewById(R.id.room_listitem_label); 

     } 

     @Override 
     public void onClick(View view) { 
      int pos = getPosition(); 
      mListener.editname(pos); 



     } 
    } 
    public static interface IRoomViewClick 
    { 
     public void editname(int pos); 
    } 

} 

enter image description here

+0

कि न सिर्फ मुझे बटन के बजाय ViewHolder ही करने के लिए एक रेफरी मिल सकते हैं? – gsueagle2008

+0

हे ... मैंने सवाल को सावधानी से नहीं पढ़ा ... मैंने सोचा कि आपको एक स्थिति की आवश्यकता है (क्योंकि मुझे आपके कोड में getPosition() के शरीर को नहीं देखा गया था ... लेकिन हाँ, आप वहां ViewHolder डाल सकते हैं इसके बजाए ... लेकिन तब आप स्थिति को नहीं जान पाएंगे, क्योंकि ... ठीक है, यह रीसाइक्लर व्यू है और व्यू/व्यूल्डर हो सकता है ... रीसाइक्लिंग ... – Selvin

+0

हाँ, मैंने अपने कोड में getPosition() फ़ंक्शन को कार्यान्वित करना याद किया। शायद यह मदद नहीं की। मैं अभी भी टैग्स को टैग करने और प्राप्त करने पर पूरी तरह स्पष्ट नहीं हूं, और इसे एक व्यूहोल्डर में परिवर्तित कर रहा हूं जिसे मैं कुशल बना सकता हूं। – gsueagle2008

उत्तर

19

आप onBindViewHolder में editBtn के लिए एक टैग सेट कर सकते हैं:

public RoomViewHolder(View itemView, IRoomViewClick listener) { 
     .... 
     editBtn =(Button) itemView.findViewById(R.id.editbtn); 
     //add tag for this view 
     editBtn.setTag(this); 
     .... 
    } 

और onClick

@Override 
    public void onClick(View view) { 
     //getTag 
     RoomViewHolder holder = (RoomViewHolder)(view.getTag()); 
     int pos = getPosition(); 
     mListener.editname(pos); 
    ... 
    } 
+11

अविश्वसनीय है कि Google ने इसे करने का बेहतर तरीका नहीं सोचा - लगभग साल बीत गया और व्यूहोल्डर प्राप्त करने का कोई बेहतर तरीका नहीं है कि पुराने सेटटैग विधि (जो व्यू धारक अनौपचारिक पैटर्न का हिस्सा था) ... – Nuwisam

+1

यहां आपको कैसे मिलेगा getPosition() ??? –

1

में इसे पाने कि RecycleView दृश्य स्थिति बचाता बाहर मुड़ें मैं n व्यू लेआउट पैरामीटर है, तो आप बस सूची से सही आइटम प्राप्त करने के लिए आप इस का उपयोग कर सकते से देखने स्थिति चाहते हैं:

RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams(); 
lp.getViewPosition(); 
+0

'getViewPosition' को बहिष्कृत किया गया है, अब आपको आमतौर पर बाद में' getViewLayoutPosition' या 'getViewAdapterPosition'' का उपयोग करना चाहिए। – user3175580

5
@Override 
public void onClick(View v) { 
    int pos = getAdapterPosition(); //getPosition() is deprecated 
    notifyItemChanged(pos); 
} 

notifyItemChanged अपने onBindViewHolder सूचित करेंगे, तो आप कुछ की तरह कर सकते हैं इस

public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) { 
    Room r = getItem(i); 
    roomViewHolder.label.setText(r.name); 
    if(i == pos){ // Do Something } 

} 

जब भी आप आइटम पर क्लिक करें, यह स्थिति 'मान बदलने और ट्रिगर किया जाएगा // कुछ

10

वास्तव में आप क्या कर सकते हैं करते हैं की तुलना में बेहतर getTag RecyclerView पर getChildViewHolder(View child) फोन करके:

@Override 
public void onClick(View v) { 
    MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v); 
    holder.textView.setText("Clicked!"); 
} 
+0

यह आइटम में सभी विचारों को एक्सेस किया जा सकता है या केवल आइटम पर क्लिक किया जा सकता है?https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/594 –

+0

जब दृश्य क्लिक किया जाता है, तो यह फ़ंक्शन उस दृश्य को एक्सेस करेगा जिसे क्लिक किया गया है। लेकिन इसके अलावा 'ऑनक्लिक' हैंडलर में होने के अलावा, यह उन विचारों को प्राप्त कर सकता है जिन्हें क्लिक किया गया है या नहीं। –

+0

धन्यवाद, मैं सोच रहा हूं कि बिटमैप फॉर्म रीसाइक्लिंगव्यू प्रदर्शित हो रहा है जो छवियों को व्हाट्सएप के माध्यम से साझा करने के लिए आकर्षित किया जा सकता है !! छवि को ठीक से काम कर रहा है लेकिन यह बहुत धीमा है (फ्र्रेस्को का उपयोग कर रहा है !! –

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