2016-04-24 7 views
12

मेरे onBindViewHolder में RecyclerView.Adapter<SearchAdapter.ViewHolder> में जब उपयोगकर्ता cardview पर क्लिक करता है तो एक बटन दिखाई देता है। लेकिन जब मैं रीसाइक्लिंगव्यू स्क्रॉल कर रहा हूं तो कुछ अन्य आइटम बटन भी दिखाई देने के रूप में दिखाए जाते हैं। ये क्यों हो रहा है?पुनर्नवीनीकरण के आइटम उलझन में

यह मेरा कोड है:

@Override 
public void onBindViewHolder(final ViewHolder viewHolder, final int position) { 
    viewHolder.card.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (viewHolder.content_layout.getVisibility() == View.VISIBLE) { 
       viewHolder.content_layout.setVisibility(View.GONE); 
       viewHolder.address.setMaxLines(2); 
       viewHolder.attribute.setMaxLines(2); 
      } else { 
       viewHolder.content_layout.setVisibility(View.VISIBLE); 
       viewHolder.address.setMaxLines(8); 
       viewHolder.attribute.setMaxLines(8); 
      } 
     } 
    }); 
    ... 
} 
+0

कृपया यहाँ –

+0

अपने कोड @akhilRao –

उत्तर

10

एक बार जब आप सूची को स्क्रॉल करना शुरू कर देते हैं तो आपके विचार पुनर्नवीनीकरण हो जाते हैं। इसका मतलब है कि पहले फुलाए गए व्यूहोल्डर (कुछ जो onCreateViewHolder में बनाए जाते हैं) का पुन: उपयोग किया जाता है।
तो आपको क्लिक करने की स्थिति को याद रखना है (उदा। SparseBooleanArray के माध्यम से) और onBindViewHolder में चेक करें कि दृश्य दृश्यमान होना चाहिए (पहले क्लिक किया गया था) या नहीं।

आप this StackOverflow पद

+0

धन्यवाद कि हल –

2

उदाहरण बूलियन सरणी के लिए एक सरणी बनाते हैं, और जब प्रत्येक स्थिति क्लिक किया, सरणी के एक ही स्थिति में सही निर्धारित किया है। और ऑनबिंडव्यूहोल्डर में जांचें कि क्या सरणी [स्थिति] सही है कि आइटम दृश्यमान है।

+0

मैं के साथ कि कर रहा हूँ तैनात पोस्ट 'arraylist.get (स्थिति) .type' –

6

में SparseBooleanArray की एक बुनियादी उपयोग का उदाहरण देखने पा सकते हैं 'अन्य' दृश्यमान आइटम बटन एक ही viewholder कि कॉलबैक में संशोधित किया गया था का उपयोग कर लोगों को कर रहे हैं। तो क्योंकि viewholders (और विचार) पुनर्नवीनीकरण:

  • वे केवल जानकारी है कि हर बार viewholder की स्थिति के लिए बाध्य है पुनः प्राप्त किया जा सकता है की दुकान चाहिए।

  • कोई भी चीज जो विचारों राज्य में बदला जा सकता है onBindViewHolder()

में ताज़ा किया जाना चाहिए आपके मामले में आप संग्रहीत करना चाहिए 'चुना जाता है' कहीं और और दृश्यता और onBindViewHolder() में Maxlines रीसेट (न केवल कॉलबैक में)

5

अच्छा विचार है सभी डेटा आप recycler ध्यान में रखते हुए एक आइटम के लिए की जरूरत के साथ एक वर्ग वस्तु बनाने के लिए है, यह भी एक बूलियन isItemWasClicked और onBindViewHolder() जांच इस बूलियन अंदर जोड़ सकते हैं और बटन v बनाने समझदार या नहीं। उदाहरण के लिए:

public class OneItemOfList{ 
    int priceToDisplay; 
    String name; 
    String date; 
    boolean wasClicked; 
} 

public class YourAdapter extends RecyclerView.Adapter<OneItemOfList.ViewHolder> { 
ArrayList<OneItemOfList> items; 
... 
@Override 
public void onBindViewHolder(ViewHolder viewHolder, final int position) { 
    viewHolder.view.setText(items.get(position).name); 
    if (items.get(position).wasClicked) 
     viewHolder.button.setVisible(View.VISIBLE); 
    else 
     viewHolder.button.setVisible(View.GONE); 
    viewHolder.view2.setOnClickListener(... 
     OnClick(...){ 
      items.get(position).wasClicked = !items.get(position).wasClicked; 
     }); 
} 
... 
} 
+0

अच्छा विचार है धन्यवाद –

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