2015-09-18 7 views
5

मेरे पास एक एंड्रॉइड लिस्ट व्यू नहीं है, जिसमें एक बटन होता है जिसे क्लिक करने पर चेक करने की आवश्यकता होती है। आप शायद मैं हरे रंग की प्रारंभिक करने के लिए पृष्ठभूमि बदल रहा हूँ देख सकते हैं, जब मैं "चेकबॉक्स" पर क्लिक करें पृष्ठभूमि लाल होने की जरूरत है (यह सिर्फ एक परीक्षण हैएंड्रॉइड लिस्ट व्यू में देखें

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 

    LayoutInflater inflater = this._context.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.checkbox_cell, null); 
     holder = new ViewHolder(); 
     holder.checkbox = (CheckBox) convertView.findViewById(R.id.button); 
     holder.textView = (TextView) convertView.findViewById(R.id.textView); 
     convertView.setTag(holder); 

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


    if(holder.checkbox.isChecked()) { 
     convertView.setBackgroundColor(Color.RED); 
     holder.textView.setBackgroundColor(Color.RED); 
     convertView.invalidate(); 
    } else { 
     convertView.setBackgroundColor(Color.GREEN); 
    } 

    holder.checkbox.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      Arrays.sort(_context.checkBoxIds); 
      int index = Arrays.binarySearch(_context.checkBoxIds, position); 

      if (((CheckBox) v).isChecked()) { 
       holder.textView.setPaintFlags(holder.textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 

      } else { 
       holder.textView.setPaintFlags(holder.textView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
      } 
      holder.textView.setBackgroundColor(Color.RED); 
      notifyDataSetChanged(); 

     } 
    }); 

    return convertView; 
} 

: क्लिक करें घटना काम कर रहा है देखें कि यूआई अपडेट क्या है)। मैंने onClick में विचारों को अपडेट करने का प्रयास किया, लेकिन यह काम नहीं कर रहा है। onClick के बाद मैं notifyDataSetChanged() पर कॉल करता हूं यह देखने के लिए कि UI रीफ्रेश होने पर यूआई बदलता है या नहीं। holder.checkbox.isChecked() सत्य प्रतीत होता है लेकिन जब मैं पृष्ठभूमि को लाल पर सेट करता हूं तो यूआई अपडेट नहीं होगा। क्या किसी को पता है कि यहां क्या गलत है? मैं इस समय अनजान हूँ।

+0

क्या आपके कोड के अंदर @ ओवरराइड एनोटेशन है और आप बस अपने ऑनक्लिक लिस्टनर के लिए पोस्ट करना भूल गए हैं? – Opiatefuchs

+0

आह हाँ, इसे पोस्ट करना भूल गया। ओवरराइड है :) –

+0

@LeonBoon: [NotifyDataSetChanged()] (http://stackoverflow.com/a/12229903/1920735) दृश्य को फिर से निकालने के लिए सूचीदृश्य से पूछेगा, इसलिए जब यह स्वयं को फिर से चलाएगा, तो यह एक नए धारक को संदर्भित करेगा .checkbox.is चेक(), जो डिफ़ॉल्ट रूप से गलत होगा (अनुमान), इसलिए कोई लाल रंग पृष्ठभूमि रंग प्रकट नहीं होता है। – avinash

उत्तर

2

आपको अपने डेटा प्रतिनिधित्व के आधार पर दृश्य को अपडेट करना चाहिए। हालांकि आप चेकबॉक्स दृश्य स्थिति के आधार पर दृश्य अपडेट कर रहे हैं जो पहले कभी सेट नहीं है।

तो आप पहली बार है कि स्थिति के लिए और उपयोग के बाद संबंधित डेटा के भाग पर आधारित चेकबॉक्स अद्यतन करना चाहिए यह आगे

1

आप चेकबॉक्स क्लिक सुनने और चेकबॉक्स पर setTag() का उपयोग करने के एडाप्टर के अंदर इंटरफेस परिभाषित कर सकते हैं और है कि इंटरफ़ेस को लागू करता है टुकड़े या गतिविधि पर और गतिविधि या टुकड़े के अंदर अपनी परिभाषा को परिभाषित करें।

1

यदि आप अपना कोड डीबग करते हैं, तो मुझे लगता है कि if(holder.checkbox.isChecked()) { यह लाइन हमेशा false वापस आ जाएगी। ऐसा इसलिए है क्योंकि आपने CheckBox की डिफ़ॉल्ट ऑन-क्लिक घटना को ओवरराइड कर दिया है, जो इसे क्लिक करते समय चेक स्थिति को टॉगल करना चाहिए, हालांकि आपके ओवरड्रिन के बाद, आपने चेक स्थिति टॉगल करने के लिए अनदेखा किया, यही कारण है कि पृष्ठभूमि को लाल रंग में भी बदला नहीं जा सकता notifyDatasetChanged जारी करने के बाद।

तो कृपया holder.checkbox.setChecked(!checkbox.isChecked()); को अपने OnClickListener की पहली पंक्ति में जोड़ने का प्रयास करें ताकि यह देखने में मदद मिल सके।

1

एंड्रॉइड: क्लिक करने योग्य = "सत्य" कृपया इस टूर चेक बॉक्स को एक्सएमएल में जोड़ें, फिर आप अपने कोड के साथ प्रयास करें, जब भी आप एडाप्टर पर कुछ ऑपरेशन करते हैं तो आपको इसके साथ अपडेट करने की आवश्यकता होती है।

1

सबसे पहले और सबसे महत्वपूर्ण बात यह है कि आपको याद रखना होगा कि सूची में कौन से आइटम चेक किए गए हैं, और जो नहीं हैं। इसके लिए आप SparseBooleanArray का उपयोग कर सकते हैं।

फिर getView में आपको यह देखने के आधार पर उचित रूप से दृश्य सेट करने की आवश्यकता है या नहीं।

अंत में जब भी कोई चेकबॉक्स पर क्लिक करता है तो आपको सरणी को अपडेट करने की आवश्यकता होती है। आप निषेध उचित रूप से जोड़ने के लिए आवश्यकता हो सकती है -

public class MyAdapter extends BaseAdapter { 

private SparseBooleanArray checkedItems = new SparseBooleanArray(); 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     LayoutInflater inflater = this._context.getLayoutInflater(); 

     if (convertView == null) { 
      // ... 
     } else { 
      // ... 
     } 

     holder.checkbox.setOnClickListener(null); // You may be reusing views, so avoid firing previous listener set 

     holder.checkbox.setChecked(checkedItems.get(position, false)); // Set checked value for the checkbox based on your checked items array 

     if(holder.checkbox.isChecked()) { 
      // Do your stuff 
     } else { 
      // Do your stuff 
     } 

     holder.checkbox.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       checkedItems.put(position, ((CheckBox) v).isChecked()); // (!) 
       // do stuff 
      } 
     }); 

     return convertView; 
    } 
} 

मैं क्योंकि मुझे याद है कभी नहीं है कि क्या चेकबॉक्स पर onClick घटना आप वर्ष या नई जाँच की राज्य देता है (!) साथ एक पंक्ति में चिह्नित।

0

इसका सरल! .. आपको notifyDataSetChanged(); के बाद समान नियंत्रण नहीं मिलता है क्योंकि यह फ़ंक्शन रीफ़्रेश दृश्य को रीफ्रेश करता है।

public View getView(final int position, View convertView, ViewGroup parent) { 
return convertView; 
} 

ताकि आप चेक बॉक्स की स्थिति प्राप्त न कर सकें, यह सभी दृश्यों को ताज़ा कर देता है।

आपको किसी भी बाइंडर क्लास का उपयोग करके डेटा स्टेट के रूप में चेक स्टेट ढूंढना होगा।

जब आप क्लिक करते हैं, तो आप डेटा की स्थिति बनाते हैं।

List<CheckState> checkState=new ArrayList<CheckState>();// as an instance 


holder.checkbox.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      if (((CheckBox) v).isChecked()) { 

checkState.add(new CheckState(true); 

     } else{ 

      checkState.add(position,false); 

     } 
    }); 





if(checkState.get(position).isChecked()) 
    { 
     convertView.setBackgroundColor(Color.RED); 
     holder.textView.setBackgroundColor(Color.RED); 
     convertView.invalidate(); 
    } else { 
     convertView.setBackgroundColor(Color.GREEN); 
    } 

उदाहरण: - बनाने के एक भीतरी वर्ग

public class CheckState { 

    boolean isChecked; 

    public CheckState(boolean isChecked) { 

     this.isChecked = isChecked; 
    } 

    public boolean isChecked() { 
     return isChecked; 
    } 



} 

मुझे लगता है कि यह आप के लिए उपयोगी है!

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