2012-03-25 19 views
6

मैं एक कस्टम Listview बनाया सूचीदृश्य में प्रत्येक आइटम के साथ एक निम्नलिखित लेआउटफोर्स सूची दृश्य दृश्य (चेकबॉक्स)

contactlayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:weightSum="1"> 
    <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="134dp" android:layout_height="108dp" android:focusable="false"></CheckBox> 
    <LinearLayout android:id="@+id/linearLayout1" android:layout_height="match_parent" android:orientation="vertical" android:layout_width="87dp" android:layout_weight="0.84" android:weightSum="1" > 
     <TextView android:text="TextView" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/name" android:layout_weight="0.03"></TextView> 
     <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/phone"></TextView> 
     <TextView android:text="TextView" android:layout_height="wrap_content" android:layout_weight="0.03" android:layout_width="match_parent" android:id="@+id/contactid" android:visibility="invisible"></TextView> 
    </LinearLayout> 
</LinearLayout> 

मैं होने (getView() विधि अधिभावी के बिना) का पुनः उपयोग न एक निम्नलिखित तरीके से एक SimpleCursorAdapter का उपयोग कर Listview पॉप्युलेट हूँ ...

Cursor c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 

     String from[] = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; 
     int to[] = new int[]{R.id.name,R.id.phone,R.id.contactid}; 
     SimpleCursorAdapter s = new SimpleCursorAdapter(this,R.layout.contactlayout,c,from,to); 
     lv.setAdapter(s); 

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

उत्तर

अंत में मैं कार्यान्वित क्या @sastraxi सुझाव दिया ...

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

     final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox1); 
     final TextView name = (TextView) view.findViewById(R.id.name); 
     final TextView contactId = (TextView) view.findViewById(R.id.contactid); 
     final int pos = position; 
     checkBox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       if(checkBox.isChecked()) 
       { 
        checkList.add(String.valueOf(pos)); 
        nameList.add(name.getText().toString()); 
        contactList.add(contactId.getText().toString()); 
        Log.i("Chk added",String.valueOf(pos)); 
       } 
       else 
       { 
        checkList.remove(String.valueOf(pos)); 
        nameList.remove(name.getText().toString()); 
        contactList.remove(contactId.getText().toString()); 
        Log.i("Un Chk removed",String.valueOf(pos)); 
       } 
      } 
     }); 

     if(checkList.contains(String.valueOf(pos))) 
     { 
      checkBox.setChecked(true); 
     } 
     else 
     { 
      checkBox.setChecked(false); 
     } 

     return view; 
    } 
+0

हमने हर उस क्लिक 'ListView' से जुड़ी संचालकों को देख सकते हैं में इन दोनों तरीकों ओवरराइड? – sastraxi

+0

@Sastraxi: 'Listview' में कोई भी श्रोताओं को नहीं जोड़ा है, जब मैं बटन पर क्लिक करता हूं तो मैं बस सभी चेकबॉक्स की स्थिति पढ़ रहा हूं। –

+1

बहुत बहुत धन्यवाद। इसने टॉगल बटन के साथ भी समस्या हल की। – zawhtut

उत्तर

3

आह, मुझे लगता है कि समस्या क्या है।

एक नया वर्ग का कहना है कि CheckboxSimpleCursorAdapter कि SimpleCursorAdapter फैली है, और getView जैसे ओवरराइड:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    CheckBox checkBox = (CheckBox) view.findViewById(R.id.CheckBox1); 
    checkBox.setChecked(getIsThisListPositionChecked(position)); 
    return view; 
} 

आप एक लेआउट जिसका शीर्ष स्तर के View लागू करता Checkable उपयोग नहीं कर रहे हैं, आप सब कुछ अपने आप को क्या करना है । इसमें समाशोधन स्थिति (इस मामले में) शामिल है, क्योंकि डिफ़ॉल्ट कार्यान्वयन ने View को फिर से उपयोग किया था - जैसा कि आपने सही ढंग से अंतर्ज्ञान किया था।

संपादित करें: उपयोग इस नए कोड, और एक protected boolean getIsThisListPositionChecked(int position) विधि देता है कि क्या है या नहीं आइटम वर्तमान में चेक किया गया है (या ऐसा ही कुछ) लागू करें। मुझे उम्मीद है कि मैं काफी स्पष्ट हूं - आपको यह पता लगाने की आवश्यकता है कि आइटम मॉडल के अनुसार चेक किया जाना चाहिए, और तब सेट करें जब आप View बनाते हैं।

+0

मुझे इसे आज़माएं .. –

+0

यदि मैं स्क्रॉल करता हूं तो यह सभी चेक किए गए आइटम को अनचेक करता है। जब मैं उन आइटम्स पर वापस स्क्रॉल करता हूं तो मैं उन्हें फिर से कैसे देखूं? –

+0

मैंने अपना जवाब अपडेट किया - अपूर्ण होने के लिए माफ़ी। असल में, 'सेट चेक किए गए (झूठे)' की बजाय, आपको 'सेट चेक' करने की आवश्यकता है (जो भी मॉडल कहता है कि इस आइटम की चेक की गई स्थिति अभी होनी चाहिए) '। – sastraxi

2

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

+0

हां, लेकिन मैं नहीं चाहता कि उपयोगकर्ता आइटम देख सकें, भले ही उन्होंने इसे चेक न किया हो। –

+0

@Shashank - स्ट्रिंग को सेट करने के अलावा, आपको विशेष रूप से जांचना होगा और उसके बाद वर्णित चर सूची का उपयोग कर चेक बॉक्स की स्थिति सेट करनी होगी। –

+0

@ पीटर अजटाई: मैं यह सब किस तरीके से करूँगा? 'GetView'? –

6

एक और तरीका विचारों पुन: उपयोग नहीं मजबूर करने के लिए, जोड़ने के लिए अपने कर्सर अनुकूलक में निम्नलिखित:

@Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 500; 
    } 

लेकिन हां, तो आप उसे देखे पुनः उपयोग करना चाहिए जब भी संभव हो। मेरे विशेष मामले में, मैं अपने विचारों में छवियां जोड़ रहा हूं और दृश्य का पुन: उपयोग करने के लिए मजबूर किए बिना, वे पुन: उपयोग किए गए विचारों में पुनः प्रस्तुत किए जाएंगे।

+0

मुझे लगता है कि यह है प्रदर्शन को बनाए रखने का सबसे अच्छा तरीका और पुन: उपयोग न करने के लिए देखें। –

1

अपने एडाप्टर वर्ग

@Override 
public int getViewTypeCount() 
{     
    return getCount(); 

} 

@Override 
public int getItemViewType(int position) 
{ 
return position; 
} 
संबंधित मुद्दे