2015-02-17 9 views
10

इसी तरह के प्रश्न पूछा गया है, लेकिन मैं उनमें से कोई भी काम नहीं कर सकता।रीसाइक्लिंग व्यू में आइटम का चयन करें

मैं चाहता हूं कि रीसाइक्लिंग व्यू में आइटम का चयन करें, उस आइटम दृश्य की पृष्ठभूमि बदलें, और चयनित आइटम की स्थिति को स्टोर करें।

मुख्य समस्या यह है कि आपके पास क्रिएटिव्यूहोल्डर (एडाप्टर में), ऑनबिंडव्यूहोल्डर (एडाप्टर में) और व्यूहोल्डर कन्स्ट्रक्टर है और सभी अलग-अलग तरीकों से काम कर रहे हैं। अब, मुझे यह भी नहीं पता कि क्लाक्लिस्टनर कहां रखा जाए (पिछली परियोजनाओं में मैंने इसे व्यूहोल्डर में रखा है), क्योंकि लोग अन्य दो तरीकों का भी सुझाव दे रहे हैं।

मेरा विचार सूची में प्रत्येक व्यूहोल्डर (या व्यू) को स्टोर करना था, इसलिए मैं प्रत्येक पंक्ति का संदर्भ ले सकता हूं, और वहां से पृष्ठभूमि बदल सकता हूं। लेकिन यह मेरे लिए काम नहीं करता था, क्योंकि जब मैं दृश्य (या व्यूहोल्डर्स) की सूची में जोड़ने की कोशिश करता हूं, तो किसी भी तीन स्थानों (ऑनक्रेट वीएच, ऑनबिंडवीएच, वीएच क्लास) से, मेरा ऐप किसी कारण (शून्य सूचक पूर्व) के लिए दुर्घटनाग्रस्त हो जाता है।

कोई सुझाव? इसे कहां और कैसे कार्यान्वित किया जाए?

+0

अपने मॉडल को बूलियन फ़ील्ड बनाएं: चयनित/अचयनित, जब आप आइटम पर क्लिक करते हैं तो उसके मान को टॉगल करते हैं और सूचित करते हैं ItemChanged (int position), सभी – pskink

+0

मुझे कुछ काम मिल रहा है, लेकिन जब मैं चुनता हूं एक आइटम और नीचे स्क्रॉल करें, अन्य आइटम चुने जाएंगे (वे जो चयनित आइटम का रीसायकल दृश्य)। अभी भी एक फिक्स खोज रहे हैं ... – Gudin

+0

अन्य आइटम चुने जा रहे हैं क्योंकि विचार पुनर्नवीनीकरण कर रहे हैं। आपकोViewRecycled में चयन को हटाना होगा। लेकिन अगर आप उचित "केवल-चयन-एक" व्यवहार लागू करते हैं तो आपको इससे निपटना नहीं होगा। –

उत्तर

7

भाग 1 और भाग 2 दोनों देखें। RecyclerView पर महान ट्यूटोरियल देखें। भाग 2 स्पष्ट रूप से बताता है कि रीसाइक्लिंग व्यू को चुनिंदा आइटम, ऑनक्लिक और अन्य सभी सूचीदृश्य सामग्री के साथ कैसे कार्यान्वित किया जाए। स्रोत कोड भी जिथब पर दिया जाता है। आशा है कि यह मदद करता है

http://www.bignerdranch.com/blog/recyclerview-part-2-choice-modes/

+0

अच्छे लेख के लिए धन्यवाद। मुझे एक आइटम के लिए चयन करने का चयन मिला, लेकिन जब मैं नीचे स्क्रॉल करता हूं, तो अन्य आइटम भी चुने जाएंगे (मुझे लगता है कि पहले से चुने गए आइटम के रीसायकल दृश्य)। – Gudin

+0

लागू करें ऑनडिट लिस्टनर और एडिट (int स्थिति) पर ओवरराइड करें। मुझे लगता है कि अगर आप यह सुनिश्चित करने के लिए शर्त चुनते हैं कि चयनित स्थिति चयनित हैं तो आप इसका उपयोग कर सकते हैं। यदि आपको कोई मिलता है तो कृपया समाधान पोस्ट करें :) – rafid059

10

स्थिति की दुकान और ViewHolder में श्रोता क्लिक संभालने के लिए वैश्विक चर करें। आइटम के Onclick, इस कोड के साथ तो onBindViewHolder

if(postion==globalPosition) 
{ 
    //change color like 
    textview.setTextColor(Color.RED); 
} 
else 
{ 
    //revert back to regular color 
    textview.setTextColor(Color.WHITE); 
} 

में

textView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     globalPosition=getAdapterPosition(); 
     notifyDataSetChanged(); 
    } 
}); 

की तरह वैश्विक स्थिति मान बदलने, आइटम आप लाल रंग प्राप्त क्लिक किया और सभी अन्य सफेद में हो wiil।

+0

बहुत अच्छा काम +1 –

+0

सूचित करेंडेटाट चेंज काम करता है लेकिन यह आपके विचारों के लिए खराब है, यदि आपके पास डेटा का एक बड़ा सेट है। यह अधिसूचना से हैडेटासेट किया गया दस्तावेज: यह घटना निर्दिष्ट नहीं करती है कि डेटा सेट के बारे में क्या बदल गया है, किसी भी पर्यवेक्षकों को यह मानने के लिए मजबूर करना कि सभी मौजूदा आइटम और संरचना अब मान्य नहीं हो सकती है। लेआउटमेनर्स को सभी दृश्यमान दृश्यों को पूरी तरह से पुनर्विचार और रिलायंस करने के लिए मजबूर किया जाएगा। –

+0

हाँ आप सही हैं, यदि अधिक संख्या में विचार हैं तो यह प्रदर्शन को प्रभावित करेगा – Sadashiv

0

सबसे पहले, आपने पूछा कि ऑनक्लिक लिस्टनर कहां रखना है - आपको इसे ऑनबिंडहोल्डर में रखना चाहिए। तुम भी तो की तरह अपने आइटम के 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> 
संबंधित मुद्दे