2012-09-28 18 views
15

के अंदर चेक किए गए टेक्स्ट दृश्य को चेक/अनचेक करने में असमर्थ मैं कस्टम सूची दृश्य में फ़ोन संपर्क लोड कर रहा हूं। प्रत्येक पंक्ति एक चेक करने योग्य LinearLayout है जिसमें एक चेकडटेक्स्ट व्यू और एक अन्य टेक्स्ट व्यू होता है।GetView

मैं एक कस्टम ArrayAdapter के साथ सूची दृश्य खिला रहा हूँ। मेरी समस्या यह है कि मैं getView() के अंदर CheckedTextViews को नियंत्रित नहीं कर सकता। उदाहरण के लिए जब मैं निम्नलिखित

public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null){    
      row = inflater.inflate(layout, parent, false); 
     } 

     CheckedTextView checkedTextView = (CheckedTextView) row.findViewById(R.id.checkedTextView); 
     checkedTextView.setText("A"); 
     checkedTextView.setChecked(true); 
     return row; 
    } 

हर पाठ दृश्य जब भी मैं सूची दृश्य स्क्रॉल जाँच करने के लिए चाहिए था कि कोशिश, लेकिन वह नहीं हो रहा है। क्या कोई मुझे बता सकता है कि यह कैसे करें?

संपादित करें: यह getView() के अंदर यह जांच करने के लिए महत्वपूर्ण है, मैं सिर्फ सभी setListAdapter()

EDIT2 के बाद जांच नहीं कर सकता: यह एक्सएमएल प्रत्येक पंक्ति को देखते दिखा फ़ाइल है

<?xml version="1.0" encoding="utf-8"?> 
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckedTextView 
     android:id="@+id/checkedTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
     android:paddingBottom="0dp" 
     android:text="CheckedTextView" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/subTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Small Text" 
     android:paddingTop="0dp" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</com.example.multiplecontacts.CheckableLinearLayout> 

चेक करने योग्य लाइनेरआउट एक कस्टम लेआउट है जो लाइनरलाइट और लागू करता है जैसा कि मैंने पहले कहा था चेकआउट योग्य है। और मैंने इसे here

+0

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

+0

के अंदर एक चेकड टेक्स्टव्यू टॉगल करने में सक्षम होना है, कृपया आप xml –

+0

पोस्ट कर सकते हैं आपको 'चेकबॉक्स' के साथ लेआउट मिला है, लेकिन जब आप 'चेकबॉक्स' दबाते हैं तो चेक नहीं किया जाता है? –

उत्तर

26

से लिया है क्या आपने अपने लेआउट xml में अपने CheckedTextView के लिए चेकमार्क संपत्ति सेट की है?

उदाहरण के लिए: android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextView सिर्फ एक पाठ के साथ एक चेकबॉक्स नहीं है। आप यह भी ध्यान दें चाहिए, कि CheckedTextView फ़ोकस करने योग्य नहीं, या कुछ हेरफेर के बिना क्लिक करने योग्य है (क्योंकि यह ListView के लिए डिजाइन किया गया था और इसलिए यह राज्य ListView के setOnItemClickListener द्वारा नियंत्रित होना चाहिए है)

setChoiceMode एक ListView के लिए सेट किया जाना चाहिए। और एडाप्टर के getView के अंदर पंक्ति की जांच के माध्यम से किया जाना चाहिए: listView.setItemChecked(position, value)

+0

मैंने किया। और जब मैं एक आइटम खुद दबाता हूं तो यह सामान्य रूप से चेक/अनचेक किया जाता है। यह सिर्फ getView() के अंदर है जो इस तरह व्यवहार करता है। –

+0

तो इसे केवल setOnItemClickListener में नियंत्रित किया जा सकता है ?? इसे बाहर टॉगल करने का कोई तरीका नहीं है? –

+0

जहां कोड का यह टुकड़ा लिखा जाना चाहिए? मैं स्वचालित रूप से checkTextView को टॉगल करने का प्रयास कर रहा हूं, न कि जब ऑनक्लिक ईवेंट जारी किया जाता है। मैंने पहले से ही ListItemClick पर लागू किया है और यह अच्छी तरह से काम करता है। –

1

जब भी आप सूची स्क्रॉल करते हैं, हर बार जब यह इसकी getview() विधि को कॉल करता है। इसलिए, यदि आपके पास सूचीसेल में कोई चेकबॉक्स या कोई एडिटबॉक्स है तो यह इसे फिर से शुरू कर देगा।

मेरा विचार चेकबॉक्स की स्थिति (चेक या अनचेक) को स्टोर करना है। तो यहां मैंने पहले ऐरेलिस्ट का इस्तेमाल किया था, मैंने इसे झूठे मूल्य से भर दिया था, फिर उसके क्लिक इवेंट पर मैं इसे वास्तविक स्थिति संग्रहीत करता था।

class MyAdapter extends BaseAdapter implements OnClickListener { 

    private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to manage check box 

    private static LayoutInflater inflater=null; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> d) 
    { 
       inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     //fill with false values 
    for (int i = 0; i < d.size(); i++) 
    { 
      checks.add(i, false); 
    } 
    } 

    public int getCount() 
    { 
     return data.size(); 
    } 

    public Object getItem(int position) 
    { 
     return position; 
    } 

    public long getItemId(int position) 
    { 
     return position; 
    } 




     public View getView(int position, View convertView, ViewGroup parent) 
     { 

     View vi=convertView; 

     if(convertView==null) 

      vi = inflater.inflate(R.layout.<your layout>, null); 

      //Checkbox is of button type----android:button="@drawable/btn_check" 
      //make a selector xml for checkbox  

      checkBox=(CheckBox)vi.findViewById(R.id.check_box); 


      checkBox.setTag(Integer.valueOf(position)); 
      checkBox.setOnClickListener(this); 
      checkBox.setChecked(checks.get(position)); 


     return vi; 
    } 

     @Override 
     public void onClick(View v) 
     { 
      int viewId=v.getId(); 
      if(viewId== R.id.check_box) 
      { 
      Integer index = (Integer)v.getTag(); 
      boolean state = checks.get(index.intValue()); 
      checks.set(index.intValue(), !state); 

      } 
     } 
    } 

अद्यतन: समाधान 2: आप अपने व्यूहोल्डर वर्ग में एक बूलियन चर डाल सकते हैं। यह बुलियन वैरिएबल गीलेर आइटम को परिभाषित करने के लिए प्रयोग किया जाएगा या नहीं।

आशा है कि इससे आपकी मदद करनी चाहिए।

+0

चेकबॉक्स.सेट चेक (चेक .get (स्थिति)); क्या यह आपके साथ काम कर रहा है? चेकबॉक्स प्रकार चेकबॉक्स टेक्स्ट या सिर्फ एक चेकबॉक्स है? –

+0

@ इस्लामहसन हाँ यह मेरी तरफ काम कर रहा है। यहां मेरा चेकबॉक्स बटन प्रकार का है। –

1

@ पियर-लुक गेंड्रेऔ और @ फॉक्स ने टिप्पणियों में समाधान का उल्लेख किया लेकिन उत्तर में नहीं, इसलिए उनकी ओर से उत्तर पोस्ट करना।

जैसा कि @AlexOrlov द्वारा उल्लिखित है, CheckedTextView फोकस करने योग्य नहीं है, या कुछ हेरफेर के बिना क्लिक करने योग्य है। तो आपको सूची दृश्य का उपयोग करके आइटम चेक सेट करना है, आप इसे एडाप्टर से या गतिविधि/खंड से कर सकते हैं जहां आपके पास ListView है।

एडाप्टर से यह ऐसा करने के लिए

public View getView(int position, View convertView, ViewGroup parent) 
{ 
if (//logic) { 
((ListView) parent).setItemChecked(position, true); 
} 
} 

गतिविधि से

,/टुकड़ा

if (//logic) { 
listView.setItemChecked(position, true); 
} 
संबंधित मुद्दे