17

RecyclerView पंक्ति में क्लिक की गई वस्तु की स्थिति को प्राप्त करना और onClick विधि में किसी गतिविधि के इरादे से कैसे संभव है?पुनर्चक्रण दृश्य: स्थिति प्राप्त करें और गतिविधि पर स्विच करें

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    private LayoutInflater inflater; 
    List<Information> data= Collections.emptyList(); 

    public SergejAdapter(Context context, List<Information> data){ 
     inflater = LayoutInflater.from(context); 
     this.data=data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.navigation_drawer_custom_row,parent,false); 
     MyViewHolder holder= new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current=data.get(position); 
     holder.title.setText(current.title); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      title= (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      icon.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Context context = itemView.getContext(); 
      Intent intent = new Intent(context, Ernaehrung.class); 
      context.startActivity(intent); 

     } 
    } 

यहाँ मैं सिर्फ एक onClick जब छवियों में से एक पर क्लिक किया गया है, लेकिन हर छवि एक ही मंशा है: यहाँ मेरी अनुकूलक है।

+0

चेक इस पोस्ट आउट: http://stackoverflow.com/questions/26830505/create-a-listview-with-selectable-rows-change-background-color के- सूचीदृश्य-पंक्तियाँ। यह इसे में –

+3

getPosition() हटा दिया गया है इनमें से कुछ चीजों को शामिल किया गया। आपको getLayoutPosition() या getAdapterPosition() प्राप्त करना होगा। संदर्भ https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html लिए –

उत्तर

58

आप getAdapterPosition() विधि का उपयोग कर ViewHolder से स्थिति प्राप्त कर सकते हैं। जैसा नीचे कोड में:

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    ... 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 


     @Override 
     public void onClick(View v) { 
      // here you use position 
      int position = getAdapterPosition(); 
      ... 

     } 
    } 
} 
+0

त्वरित जवाब के लिए धन्यवाद! मैंने स्विच केस के साथ किया, ठीक काम करता है। – sergejdeveloper

+0

को ध्यान में रखें कि स्थिति मैन्युअल रूप से स्थापित करने निरर्थक या अधिक विशिष्ट अनावश्यक काम है। – reVerse

+2

यह गलत है। सबसे पहले, व्यूहोल्डर के पास पहले से ही एक स्थिति है इसलिए आपको इसे जोड़ने की आवश्यकता नहीं है। दूसरी बात यह है स्थिति onBind onClick दौरान स्थिति से मेल नहीं कर सकते हैं (यदि आइटम ले जाया गया)। इसके बजाय, अद्यतित स्थिति प्राप्त करने के लिए 'ViewHolder # getPosition' का उपयोग करें। – yigit

1

के भीतर अपने onClick(View v) आप बस फोन कर सकते हैं getLayoutPosition() जो स्थिति है, जहां क्लिक हुआ वापस आ जाएगी। अधिक जानकारी के लिए official docs देखें।

@Override 
public void onClick(View v) { 
    switch(getLayoutPosition()){ 
     //TODO 
    } 
} 

अधिमानतः आप क्लिक संभालने के लिए एक अंतरफलक का उपयोग करना चाहिए:

तो अपने कोड कुछ इस तरह होगा।

+0

'getPosition()' बहिष्कृत है। इसके बजाय 'getAdapterPosition()' का उपयोग करें। –

+1

@joaquin 'getPosition()' के बजाय अब हमारे पास 'getLayoutPosition() 'और' getAdapterPosition() 'है। यदि आप वही प्रभाव चाहते हैं तो आपको 'getLayoutPosition()' को कॉल करना चाहिए क्योंकि यह उसी विधि स्टब पर मैप करता है। 'getAdapterPosition() 'कुछ अलग करता है। डेटा के लिए – reVerse

+0

धन्यवाद। मैंने सोचा कि getAdapterPosition() का एक ही प्रभाव था। –

1

या तुम सिर्फ जोड़ सकते हैं:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder > { 

... 
    class MyViewHolder extends RecyclerView.ViewHolder { 

     public MyViewHolder (View itemView) { 
      super(itemView); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG, "Element " + getAdapterPosition() + " clicked."); 
       } 
      }); 
     } 


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