2013-05-03 8 views
6

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

मैं इसे यहाँ हल करने के लिए ListView, देखने रीसाइक्लिंग और ViewHolder तरीके के साथ स्थिति मुद्दे के बारे में पढ़ते हैं: How can I make my ArrayAdapter follow the ViewHolder pattern?

लेकिन मैं शायद कुछ गलत किया है, क्योंकि यह काम नहीं कर रहा ...

public class PresenceListAdapter extends SimpleAdapter { 
private LayoutInflater inflater; 
private List<Integer> ids; 
private List<String> statuts; 

public PresenceListAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to, List<Integer> ids, List<String> statuts) 
{ 
    super (context, data, resource, from, to); 
    inflater = LayoutInflater.from (context); 
    this.ids = ids; 
    this.statuts= statuts; 

} 

@Override 
public Object getItem (int position) 
{ 
    return super.getItem (position); 
} 

@Override 
public View getView (int position, View convertView, ViewGroup parent) 
{ 

    ViewHolder holder; 

    if (convertView == null) 
    { 
     convertView = inflater.inflate (R.layout.list_text_checkbox, null); 

     holder = new ViewHolder(); 

     holder.btn = (Button) convertView.findViewById(R.id.btnRetard); 
     holder.check = (CheckBox) convertView.findViewById(R.id.checkPresent); 

     if (statuts.get(position).equals("P")) { 
      Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_online); 
      holder.btn.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null); 
      holder.btn.setEnabled(true); 
      holder.check.setChecked(true); 
     } 
     else if(statuts.get(position).equals("R")) 
     { 
      Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_away); 
      holder.btn.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null); 
      holder.btn.setEnabled(true); 
      holder.check.setChecked(true); 
     } 
     else 
     { 
      Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_invisible); 
      holder.btn.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null); 
      holder.check.setChecked(false); 
     } 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    int id = ids.get(position); 

    if(id != 0) 
    { 
     holder.check.setTag(id); 
     holder.btn.setTag(id); 
    } 

    return super.getView (position, convertView, parent); 
} 

static class ViewHolder { 
    Button btn; 
    CheckBox check; 
} 

और मेरी श्रोता: सार्वजनिक शून्य changerPresent (देखें v) {

CheckBox checkPresent = (CheckBox) v; 
    int idPersonne = (Integer) checkPresent.getTag(); 
    View parent = (View)v.getParent(); 
    Button btn = (Button) parent.findViewById(R.id.btnRetard); 

    if(checkPresent.isChecked()) { 
     gestion.updatePresence(idPersonne, idSeance, "P"); 

     btn.setEnabled(true); 
     setBtnRetardPresent(btn);   
    } 
    else 
    { 
     gestion.updatePresence(idPersonne, idSeance, "A"); 
     btn.setEnabled(false); 
     setBtnRetardAbsent(btn); 

    } 

} 

मैं इस बिंदु पर किसी भी मदद की सराहना करेंगे, मैं कर रहा हूँ इस पर घंटों के लिए काम कर रहे हैं।

बहुत बहुत धन्यवाद।

उत्तर

13

यहाँ कैसे मैं यह काम कर दिया है। यह आपके एडाप्टर के getCount() के समान आकार होना चाहिए।

फिर अपने getView पर, आपके चेकबॉक्स के सेटऑन चेक किए गए चेंजलिस्टर को आपके चेकबॉक्स.सेट चेक किए गए बयान को पूरा करना होगा।

उदाहरण:

holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    isChecked[position] = isChecked; 
    } 
}); 

holder.checkBox.setChecked(isChecked[position]); 
+0

बिल्कुल सही! आपकी व्याख्या के लिए धन्यवाद। – jthel

+0

दिलचस्प, क्या आप कृपया बता सकते हैं कि चेकchangelistener को सेट किए जाने से पहले क्यों होना चाहिए? धन्यवाद –

+2

यदि आपके पास अन्य चीजें हैं जो आप ऑनचैच चेंज (जैसे सूची आइटम रंग आदि) में करना चाहते हैं, तो ये चीजें तब नहीं होतीं जब आप श्रोता को सेट करने से पहले सेट चेक करते हैं। – josephus

0

समस्या क्योंकि सच सूचीदृश्य recycles कि यह getView( में विचार

तो) विधि की है

 if (convertView == null) 
     { 
    ........ 
     } 
    else 
     { 
      holder = (ViewHolder) convertView.getTag(); 


     } 
    // Uncheck needed boxes here... You need to implement your logic 
     if('position' is checked earlier) 
     holder.check.setChecked(true); 
     else 
     holder.check.setChecked(false); 

अगर परिवर्तित रिक्त नहीं है आप को देखने के राज्य का प्रबंधन करने के कोड लिखने की जरूरत है , क्योंकि यह पहले से ही उपयोग किया गया दृश्य है जो चेक बॉक्स चेक किया जा सकता है। BTW

if (convertView == null) { 
    viewHolder = new ViewHolder(); 
    convertView.setTag(viewHolder); 
} else { 
    viewHolder = (ViewHolder) convertView.getTag(); 
} 

viewHolder.checkedBox.setChecked(); 

:

0

आप ViewHolder के प्रारंभ के बाहर CheckedBox राज्य स्थापित करना चाहिए, निम्नलिखित कोड की तरह CheckedBox राज्य स्टोर करने के लिए दो सूची के बजाय SparseBooleanArray का उपयोग करें।

पहले, आप अपने जाँच की राज्य के लिए एक अलग सरणी की जरूरत है:

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