मैं एक RecyclerView.Adapter
वर्ग के लिए निम्नलिखित कोड है और यह ठीक काम करता है:एक RecyclerView.Adapter के BindViewHolder के अंदर ऑनक्लिक लिस्टनर क्यों जोड़ रहा है खराब अभ्यास माना जाता है?
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Viewholder> {
private List<Information> items;
private int itemLayout;
public MyAdapter(List<Information> items, int itemLayout){
this.items = items;
this.itemLayout = itemLayout;
}
@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new Viewholder(v);
}
@Override
public void onBindViewHolder(Viewholder holder, final int position) {
Information item = items.get(position);
holder.textView1.setText(item.Title);
holder.textView2.setText(item.Date);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
return true;
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class Viewholder extends RecyclerView.ViewHolder {
public TextView textView1;
public TextView textView2;
public Viewholder(View itemView) {
super(itemView);
textView1=(TextView) itemView.findViewById(R.id.text1);
textView2 = (TextView) itemView.findViewById(R.id.date_row);
}
}
}
हालांकि, मेरा मानना है कि यह बुरा व्यवहार onBindViewHolder
विधि में OnClickListener लागू करने के लिए है। यह बुरा अभ्यास क्यों है, और बेहतर विकल्प क्या है?
अनावश्यक क्लिक श्रोता सेट अप से बचने के लिए यह करना चाहिए! लेकिन क्या हम इसे क्रिएटिव्यूहोल्डर() पर लागू कर सकते हैं क्योंकि ब्रूसलेट सुझाव देता है (नीचे जवाब देखें)। –
@ सुजीतवाडव मुझे लगता है कि इसका एक ही प्रभाव होगा, क्योंकि 'ऑनक्रेट व्यूहोल्डर()' को केवल एक बार (प्रति व्यूहोल्डर) कहा जाता है, ताकि आप इसे अपने व्यूहोल्डर कन्स्ट्रक्टर के अंदर या 'ऑनक्रेट व्यूहोल्डर()' में व्यक्तिगत प्राथमिकता के रूप में लागू कर सकें । मैंने इसे वीएच में डालने की आदत विकसित की है, लेकिन आपको वह करना चाहिए जो आपको लगता है कि सबसे ज्यादा पठनीय है और भविष्य में आपको समझने में मदद करेगा। बस ब्रशलेट सुझाए गए प्रदर्शन कारणों के लिए 'onBindViewHolder() 'से बचें। – AdamMc331
@ सुजीत @ एमसीएडैम मुझे 'व्यूहोल्डर' कन्स्ट्रक्टर की बजाय 'ऑनक्रेट व्यूहोल्डर()' में ऐसा करना पसंद है ताकि मैं अपना 'व्यूहोल्डर' वर्ग 'स्थिर' बना सकूं और एडाप्टर को संदर्भ में ' ViewHolder'।लेकिन आखिरकार यह ज्यादातर स्टाइल पसंद है, क्योंकि 'onCreateViewHolder()' और 'new ViewHolder()' के बीच एक-से-एक पत्राचार होना चाहिए। – Brucelet