सबसे पहले, आपने पूछा कि ऑनक्लिक लिस्टनर कहां रखना है - आपको इसे ऑनबिंडहोल्डर में रखना चाहिए। तुम भी तो की तरह अपने आइटम के ViewHolder कक्षा में एक onClickListener संलग्न कर सकते हैं:
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
एक भी चयन व्यवहार को लागू करने के लिए के रूप में, यहाँ दिए गए उत्तर काम करते हैं लेकिन अगर आप मदों की एक बहुत कुछ है onNotifyDatasetChanged बुला प्रदर्शन के लिए बुरा है क्योंकि यह हर बार खरोंच से सभी विचारों को rebinds।
राफिडज़मान सॉनेट द्वारा दिया गया लिंक रीसाइक्लिंग व्यू सेट करने के बारे में बहुत सी चीजों को समझने के लिए एक अच्छा ट्यूटोरियल है, लेकिन मुझे लगता है कि यह एकल चयन व्यवहार जटिल बनाता है। मैं इसे सब कुछ देने के लिए व्यापक रूप से उत्तर देने का उत्तर देने जा रहा हूं। यहाँ मैं एक चयन व्यवहार कैसे लागू किया गया है:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final YourItemViewHolder itemViewHolder = (YourItemViewHolder) holder;
//This will remember which one was selected
itemViewHolder.getItemSelectionIndicator()
.setSelected(position == mSelectedPosition);
itemViewHolder.getItemWrapperView()
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(mLogTag, "Tapped on " + position);
//This is the previous selection
notifyItemChanged(mSelectedPosition);
itemViewHolder.getItemSelectionIndicator().setSelected(true);
mSelectedPosition = position;
//This is the new selection
notifyItemChanged(position);
}
});
getItemSelectionIndicator()
और getItemWrapperView()
आइटम की ViewHolder अंदर तरीकों है कि आइटम लेआउट से विशिष्ट दृश्यों लौट आते हैं। एक आइटम WrapperView शीर्षतम रैखिक/सापेक्ष लयआउट हो सकता है जो पूरे आइटम को लपेटता है। उस पर एक क्लिक श्रोता सेट करना सुनिश्चित करेगा कि क्लिक आइटम काम करते हैं यदि उपयोगकर्ता आइटम के दृश्य में कहीं भी टैप करता है।
आइटम चयन चयनकर्ता एक रैखिक या सापेक्ष विकल्प हो सकता है जिसे एक राज्य सूची खींचने योग्य पृष्ठभूमि सेट किया गया है। इसका अर्थ यह है कि जब इसे चयनित के रूप में सेट किया जाता है, तो यह चयन को इंगित करने के लिए स्वचालित रूप से एक आरेखण दिखाता है।जब इसे अचयनित के रूप में सेट किया जाता है, तो ड्रॉइंग स्वचालित रूप से हटा दिया जाएगा।
<RelativeLayout
android:id="@+id/selection_indicator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selection_indicator_state_list"/>
इस रेस में selection_indicator_state_list.xml/drawable है: यह सूचक दृश्य कैसा दिखाई देता है है
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selected background -->
<item android:state_selected="true"
android:drawable="@drawable/item_selection_shape"/>
<!-- Unselected background -->
<item android:state_selected="false"
android:drawable="@color/transparent"/>
</selector>
और यह/रेस में item_selection_shape.xml है drawable:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
//22 is value of transparency, BDBDBD is the color
<solid android:color="#22BDBDBD"/>
<stroke android:width="2dp" android:color="@color/md_blue_600"/>
<corners
android:radius="3dp"/>
</shape>
अपने मॉडल को बूलियन फ़ील्ड बनाएं: चयनित/अचयनित, जब आप आइटम पर क्लिक करते हैं तो उसके मान को टॉगल करते हैं और सूचित करते हैं ItemChanged (int position), सभी – pskink
मुझे कुछ काम मिल रहा है, लेकिन जब मैं चुनता हूं एक आइटम और नीचे स्क्रॉल करें, अन्य आइटम चुने जाएंगे (वे जो चयनित आइटम का रीसायकल दृश्य)। अभी भी एक फिक्स खोज रहे हैं ... – Gudin
अन्य आइटम चुने जा रहे हैं क्योंकि विचार पुनर्नवीनीकरण कर रहे हैं। आपकोViewRecycled में चयन को हटाना होगा। लेकिन अगर आप उचित "केवल-चयन-एक" व्यवहार लागू करते हैं तो आपको इससे निपटना नहीं होगा। –