6

के साथ ListView के अजीब व्यवहार में मेरे पास सूची दृश्य के ऊपर एक चेकबॉक्स है जिसमें चेकबॉक्स आइटम हैं। इसलिए जब मैं चेकबॉक्स की जांच करता हूं तो मैं सूची के सभी आइटमों की जांच करने के लिए notifyDataSetChanged() लागू करता हूं। तो उस समय मुझे getView विधि के लिए दो बार लॉग मिल रहा है, इसका मतलब है कि जब मैं notifyDataSetChanged() पर कॉल कर रहा हूं तो GetView को दो बार बुलाया जा रहा है। तो, क्या कोई मुझे बता सकता है कि मुझे दो बार लॉग क्यों मिल रहा है? इसके अलावा getView() को दो बार क्यों कहा जाता है?चेकबॉक्स

मुख्य वर्ग - एडाप्टर कक्षा के लिए

checkAll = (CheckBox) findViewById(R.id.my_check_box); 
     checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton checkbox, boolean arg1) { 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

कोड -

public class myAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    private CheckBox checkAll; 

    public myAdapter(Activity context, List<Model> list, CheckBox checkAll) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
     this.checkAll = checkAll; 

    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.row, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
      viewHolder.checkbox 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          Model element = (Model) viewHolder.checkbox.getTag(); 
          element.setSelected(buttonView.isChecked()); 
         } 
        }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 


     if(checkAll.isChecked() == true){ 
      System.out.println(position+" checked th position"); 
     } 
     else if(checkAll.isChecked() == false){ 
      System.out.println(position+" not checked th position"); 
     } 

     holder.checkbox.setChecked(list.get(position).isSelected());  
     return view; 
    } 
} 

LogCat आउटपुट जब मैं adapter.notifyDataSetChanged(); CheckAll checkboxs पर श्रोता बदलें चेक कर सकते हैं।

11-30 20:31:33.751: INFO/System.out(1300): 0 checked th position 
11-30 20:31:33.761: INFO/System.out(1300): 1 checked th position 
11-30 20:31:33.770: INFO/System.out(1300): 2 checked th position 
11-30 20:31:33.780: INFO/System.out(1300): 3 checked th position 
11-30 20:31:33.810: INFO/System.out(1300): 4 checked th position 
11-30 20:31:33.810: INFO/System.out(1300): 0 checked th position 
11-30 20:31:33.831: INFO/System.out(1300): 1 checked th position 
11-30 20:31:33.831: INFO/System.out(1300): 2 checked th position 
11-30 20:31:33.851: INFO/System.out(1300): 3 checked th position 
11-30 20:31:33.860: INFO/System.out(1300): 4 checked th position 

आप देख सकते हैं कि मैं लॉगकैट आउटपुट मुझे दो बार एक ही आउटपुट प्राप्त कर रहा हूं। तो क्या कोई यह बता सकता है कि यह क्यों हो रहा है?

+1

यह समस्या मेरे साथ भी बढ़ती है ... +1 –

+2

http: // stackoverflow।कॉम/प्रश्न/2618272/कस्टम-लिस्टव्यू-एडाप्टर-गेटव्यू-विधि-जा रहा-बहु-बार-और-इन-नो-सह इस – MKJParekh

+0

@ ललित पॉपटानी को स्क्रॉल करें क्या आप स्क्रॉल करते हैं? – Venky

उत्तर

5

अपने ListView ऊंचाई fill_parent बनाने का प्रयास करें।

लिस्विव अपने द्वारा प्रदान की गई जगह के अनुसार थोड़ा समायोजित करने का प्रयास करें, यही वह है जो मैंने सीखा, और ऐसा लगता है कि पीछे कारण है।

देखें कि यह मदद करता है या नहीं।

+2

जिसका मतलब है कि जब आप स्क्रीन के आधे हिस्से में अपनी सूचीदृश्य सेट करना चाहते हैं..तुम उपर्युक्त समस्या को हल नहीं कर सकते? – MKJParekh

+0

भर में स्क्रीन के आधे हिस्से में fill_parent .............. – viv

+0

पर हो सकता है यदि आप स्क्रीन के आधे हिस्से में अपनी सूचीदृश्य सेट करना चाहते हैं, तो आप उस –

0

यह बेकोज़ दृश्य है चेकचेलिस्टनर के अंदर होल्डर सूची स्क्रॉलिंग के साथ बदल जाएगा। इसलिए कोई मैपिंग betwen मैं चेकबॉक्स और देखेंहोल्डर इस तरह से उपयोग कर सकते हैं।

sepatera class checkchangelistener checnChecnglistener लागू करता है। कन्स्ट्रक्टर के माध्यम से चेकchangelistener पास करें।

ईजी। getView

class MyCheckChangeLsitenet implements CompoundButton.OnCheckedChangeListener 

ViewHolder viewHolder 
MyCheckChangeLsitenet(ViewHolder viewHolder) 
{ 
this.viewHolder = viewHolder ; 
} 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          Model element = (Model) viewHolder.checkbox.getTag(); 
          element.setSelected(buttonView.isChecked()); 
         } 
        }); 

GetView

viewHolder.checkbox .setOnCheckedChangeListener (नई MycheckChangeListenet (viewHolder)) में बाहर

+1

मैं वर्तमान में स्क्रॉलिंग सूची नहीं हूं हालांकि यह वही समस्या दे रहा है। –

+0

शब्द स्क्रॉल भूल जाओ। आंतरिक सूची दृश्य प्रसंस्करण से परिचित कराने की कोशिश कर रहा है। वर्णित तरीके से जाओ। यह आपकी समस्या को हल करेगा –

3

यह वास्तव में अपने प्रश्न का उत्तर नहीं है - यह सिर्फ इतना है कि यह मेरी आँखों में एक छोटे से दर्द होता है जब मैं इस देखें:

if(checkAll.isChecked() == true){ 
    System.out.println(position+" checked th position"); 
} 
else if(checkAll.isChecked() == false){ 
    System.out.println(position+" not checked th position"); 
} 

if-statement एक boolean अभिव्यक्ति की आवश्यकता है और विधि के बाद से isChecked() रिटर्न एक boolean थेरेस true/false के खिलाफ इसे मैच करने की आवश्यकता नहीं है। इसके अलावा boolean केवल true या false दोनों के लिए जांच करने की आवश्यकता नहीं है। संक्षेप में आप के लिए नीचे से ऊपर उबाल कर सकते हैं:

if(checkAll.isChecked()) 
    System.out.println(position+" checked th position"); 
else 
    System.out.println(position+" not checked th position"); 

कौन सा है और अधिक सुंदर :-)

अपने प्रोग्रामिंग कौशल की आलोचना के रूप में देखते मत करो - बस एक सीखने oppertunity रूप में देखते हैं।

+0

के लिए एंड्रॉइड: लेआउट_वेट का उपयोग कर सकते हैं मेरी समस्या के बारे में सही विचार पाने के लिए यह सिर्फ एक डेमो ऐप है। भी से धन्यवाद –

+0

यह उल्लसित है, kaspermoerch! इसे आज़माएं: 'System.out.println (स्थिति + (checkAll.is चेक()?" चेक स्थिति की स्थिति ":" स्थिति की जांच नहीं की गई ");' –

+0

यह भी काम करता है, जेफ। हालांकि मुझे लगता है कि टर्नरी ऑपरेटर को सावधानी के साथ इस्तेमाल किया जाना चाहिए। यह हमेशा पठनीयता में सुधार नहीं करता है। – kaspermoerch

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