6

enter image description hereएक एडाप्टर देखने के लिए, एंड्रॉयड, ArrayAdapter, onCheckedChanged में चेक बॉक्स के लिए एक श्रोता जोड़ने का तरीका, OnCheckedChangeListener

मुझे लगता है कि एक ArrayAdapter के माध्यम से छोटे एक्सएमएल उप विचारों की आबादी है सूचीदृश्य है। प्रत्येक छोटे दृश्य में केवल दो चीजें होती हैं, एक चेकबॉक्स और उसके आगे एक स्ट्रिंग लेबल होता है।

मैं उपयोगकर्ता चेकिंग या चेकबॉक्स को अनचेक करने की घटना को कैप्चर करने के लिए एक जांच किए गए चेंज किए गए श्रोता को सेट करना चाहता हूं।

उदाहरण के लिए श्रोता यहाँ दिखाया गया है:

listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

@Override 
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 

Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show(); 

} 

}

जहाँ मैं श्रोता कोड रख सकता हूं? और मैं इसे कैसे स्थापित करूं? ArrayAdapter के लिए

कोड:

public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{ 
    CheckBoxInfo[] objects; 
    Context context; 
    int textViewResourceId; 

    public MobileArrayAdapter(Context context, int textViewResourceId, 
     CheckBoxInfo[] objects) { 
     super(context, textViewResourceId, objects); 
     this.context = context; 
     this.textViewResourceId = textViewResourceId; 
     this.objects = objects; 

    } 

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


      if ((row_layout_view == null)){ 


       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row_layout_view = inflater.inflate(R.layout.row_layout, null); 
      } 

      //CheckBoxInfo item = objects.get(position); // for arrayList 
      CheckBoxInfo item = objects[position]; 

      if(item != null){ 

      TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1); 
      CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1); 

      if(item !=null){ 
      textView.setText(item.checkBoxName); 
      checkBox.setChecked(item.checkBoxState); 
       } 
      } 
      return row_layout_view; 
    } 


} 

उत्तर

29

अपने उदाहरण listView.setOnCheckedChangeListener या onCheckedChanged कोड का उपयोग न करें।

सबसे पहले, CheckBox के लिए, आपको setOnCheckedChangeListener() के बजाय setOnClickListener() का उपयोग करना चाहिए। आप चेक किए गए राज्य को onClick() फ़ंक्शन के अंदर प्राप्त कर सकते हैं।

दूसरा, सूची एडाप्टर के getView() फ़ंक्शन के अंदर अपना setOnClickListener() रखें।

उदाहरण:

checkBox.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     final boolean isChecked = checkBox.isChecked(); 
     // Do something here. 
    } 
}); 
+3

मैं इस वजह सूचीदृश्य रीसाइक्लिंग विचारों का काम करता है नहीं लगता। जैसे ही आप नीचे स्क्रॉल करते हैं और एक चयनित कन्वर्ट व्यू रीसाइक्लिंग किया जाता है, चेक की गई पंक्ति अनचेक हो जाती है। आप इसके आसपास कैसे जाते हैं? –

+4

यह सही व्यवहार है। जब एक दृश्य का पुन: उपयोग किया जाता है, तो इसके सभी उप-दृश्य बच्चों में अर्थहीन दृश्य की विशेषताएं होती हैं जिन्हें पुनर्नवीनीकरण किया जाता है। इसलिए, आपको हर बार 'getView() 'में सभी दृश्यों और उनके गुणों को अपडेट करना होगा। इसमें चेकबॉक्स मूल्य के साथ-साथ 'ऑनक्लिक लिस्टनर' सेटिंग भी शामिल है। संक्षेप में, श्रोता को रखें और रीसाइक्लिंग (या नए) दृश्य में एक अलग सेटिंग होने पर अपेक्षित मान पर सेट करने के लिए 'checkBox.setchecked() 'जोड़ें। –

1

धन्यवाद दाऊद! HukeLau_DABA टिप्पणी के संबंध में, मैंने सूची दृश्य ऑब्जेक्ट को OnClickListener() के अंदर चेकबॉक्स मान के साथ अपडेट करके हल किया। मेरे मामले में मैं, स्थानों की एक सूची है के रूप में अगले कोड में देखा जा सकता:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 

     //please note that objPlace, position and holder must be declared 
     //as final inside the getView() function scope. 
      @Override 
      public void onClick(View arg0) { 
       final boolean isChecked = holder.placeCheckBox.isChecked(); 
       if (isChecked){ 
        objPlace.setItemChecked("yes"); 
       }else{ 
        objPlace.setItemChecked("no"); 
       } 

       placesList.set(position,objPlace); // updating the list with the updated object 

      } 
     }); 
1

अपने onClickListener में करने के लिए "holder.placeCheckBox" का उल्लेख नहीं है, आप को देखने के लिए onClick द्वारा पारित कर दिया है जो उल्लेख करना चाहिए और यह डाली तो चेकबॉक्स को कोड इस तरह दिखना चाहिए:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      boolean isChecked = ((CheckBox)arg0).isChecked(); 
      if (isChecked){ 
       objPlace.setItemChecked("yes"); 
      }else{ 
       objPlace.setItemChecked("no"); 
      } 

      placesList.set(position,objPlace); // updating the list with the updated object 

     } 
    }); 
0

आप इस कोशिश कर सकते:

holder.placeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
     Log.d(TAG, "onCheckedChanged: " + holder.placeCheckBox.getText() + " " + (b ? "selected":"deselected")); 
    } 
}); 
संबंधित मुद्दे