2010-10-12 10 views
5

मेरे पास एंड्रॉइड ListView है जिनके आइटम में चेकबॉक्स है।चेकबॉक्स दो बार मूल्य बदलता है

चेकबॉक्स डिफ़ॉल्ट रूप से चेक किया गया है। अनचेक किए जाने के बाद इसे सूची से हटा दिया जाना चाहिए। जब मैं इसे अचयनित करने के लिए (isCheckedfalse के साथ) चेकबॉक्स नल और मैं मद (isCheckedtrue साथ) को हटाने के बाद:

समस्या यह है कि onCheckedChanged दो बार गोली चलाई जा रही है।

यह मेरा ArrayAdapter के प्रासंगिक कोड है:

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.item, parent, false); 
     holder = new ViewHolder(); 
     holder.check = (CheckBox) convertView.findViewById(R.id.check); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    final Object item = this.getItem(position); 
    holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       remove(item); // This somehow calls onCheckedChanged again 
      } 
     } 
    }); 
    return convertView; 
} 

क्या मैं गलत कर रहा हूँ?

+0

'निकालें() 'विधि क्या करती है, क्योंकि यह' ListAdapter' पर कोई विधि नहीं है? – CommonsWare

+0

मैं एक ArrayAdapter का उपयोग कर रहा हूँ। एंड्रॉइड स्रोत कोड के अनुसार, निकालने का तरीका आइटम को सरणी से हटा देता है और यह सूचित करता है कि डेटा बदल दिया गया है। – hpique

उत्तर

0

मुझे एक ही समस्या का सामना करना पड़ता है।

कुछ शोध के बाद मुझे पता चला कि सेटकैच चेंजलिस्टर के लिए रेडियो ग्रुप में एक समान व्यवहार है।

टैगिंग गड़बड़ चीजें, एक बग की तरह लगती है।

मेरा कामकाज श्रोता के अंत में टैग को शून्य पर सेट कर रहा था यह मेरे लिए काम करता था।

private OnCheckedChangeListener checkBoxitemClickListener = new OnCheckedChangeListener() { 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


     if(isChecked) 
     {    
      //do smth 
     }else 
     { 
      //do smth 
     } 

     buttonView.setTag(null);       
    } 
}; 

आप के बाद अपने ListView अद्यतन करने के लिए, मत भूलना अपने एडाप्टर पर "notifyDataSetChanged" कॉल करने के लिए की जरूरत है।

चीयर्स

5

मैं एक ही समस्या का सामना करना पड़ा है, यह एक Android बग onCheckChanged विधि के इस दो बार निष्पादन हो रहा है।

मेरा समाधान: के बजाय onClickListener लागू करें।

कुछ इस तरह:

private final class CheckUpdateListener implements OnClickListener { 

    private Group parent; 
    private boolean isChecked; 

    private CheckUpdateListener(Group parent) { 

     this.parent = parent; 

    } 

    @Override 
    public void onClick(View box) { 
     this.isChecked = !parent.isChecked(); 

     parent.setChecked(isChecked); 

     notifyDataSetChanged(); 

    } 

} 
+0

हां, मुझे लगता है कि चेकेड चेंज पर सुनना अधिकतर मामलों में करना सही नहीं है और सही काम नहीं है। हालांकि मेरे लिए मूल समस्या सही परिप्रेक्ष्य प्राप्त करना था, यानी, यह दृश्य डेटा ऑब्जेक्ट जैसा ही नहीं है। – rwst

2

मैं ने वही समस्या थी और बस का इरादा OnCheckedChangeListener का उपयोग कर से बचने के लिए बिना ठीक से यह संकल्प लिया।

समस्या कोड

holder.someCheckBox.setChecked(false); 
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { 
     ... 
    } 
}); 

नोट मैं से पहले जाँच अवस्था सेट मैं श्रोता निर्धारित करते हैं, इस सृष्टि पर फायरिंग से श्रोता को रोकने के लिए किया गया था।

लेकिन, श्रोता ने फिर से बनाए जाने के लिए या notifyDataSetChanged के उपयोग के माध्यम से केवल दो बार ऑन-चेक ईवेंट को फायर करना शुरू कर दिया।

समाधान

साफ़ से पहले श्रोता , जांच राज्य की स्थापना भी निर्माण के दौरान।

holder.someCheckBox.setOnCheckedChangeListener(null); 
holder.someCheckBox.setChecked(false); 
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { 
     ... 
    } 
}); 

अब किसी भी अवशिष्ट श्रोताओं को चेकबॉक्स के प्रारंभिक मूल्य को सेट करते समय निकाल दिया नहीं जाएगा।

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