2011-03-03 16 views
7

मैं एक बहुत ही सरल बात करना चाहते हैं। मेरे पास मेरे एप्लिकेशन में एक सूचीदृश्य है जिसमें मैं गतिशील रूप से टेक्स्ट जोड़ता हूं। लेकिन, एक निश्चित बिंदु के बाद, मैं सूचीदृश्य के अंदर पाठ का रंग बदलना चाहता हूं। इसलिए, मैंने अपनी कस्टम सूची आइटम को परिभाषित करने वाला एक एक्सएमएल बनाया, और ऐरेएडाप्टर को उप-वर्गीकृत किया। लेकिन, जब भी मैं अपने कस्टम ऐरेएडाप्टर पर ऐड() विधि को कॉल करता हूं, तो एक आइटम सूचीदृश्य में जोड़ा जाता है, लेकिन टेक्स्ट इसमें नहीं रखा जाता है।अधिभावी एंड्रॉयड ArrayAdapter

यहाँ मेरी एक्सएमएल है: `

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_content" android:textSize="8pt" 
    android:gravity="center" android:layout_margin="4dip" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FF00FF00"/> 

और मेरे ArrayAdapter उपवर्ग:

private class customAdapter extends ArrayAdapter<String> { 
    public View v; 
    public customAdapter(Context context){ 
     super(context, R.layout.gamelistitem); 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent){ 
     this.v = convertView; 
     if(v==null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v=vi.inflate(R.layout.gamelistitem, null); 
     } 

     if(timeLeft!=0) { 
      TextView tv = (TextView)v.findViewById(R.id.list_content); 
      //tv.setText(str[pos]); 
      tv.setTextColor(Color.GREEN); 
     } 
     else { 
      TextView tv = (TextView)v.findViewById(R.id.list_content); 
      //tv.setText(str[pos]); 
      tv.setTextColor(Color.RED); 
     } 

     return v; 
    } 
} 

मुझे यकीन है कि मैं कुछ बहुत गलत हो कर रहा हूँ, लेकिन मैं अभी भी एक छोटे से एंड्रॉयड के लिए नया हूँ ।

धन्यवाद! `

उत्तर

10

आप getView() में पाठ सेट करना होगा। getItem(pos) के साथ सेट करने के लिए मान प्राप्त करें, फिर इसे सेट करें।

public View getView(int pos, View convertView, ViewGroup parent){ 
    this.v = convertView; 
    if(v==null) { 
     LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v=vi.inflate(R.layout.gamelistitem, null); 
    } 

    // Moved this outside the if blocks, because we need it regardless 
    // of the value of timeLeft. 
    TextView tv = (TextView)v.findViewById(R.id.list_content); 
    tv.setText(getItem(pos)); 

    if(timeLeft!=0) { 
     //TextView tv = (TextView)v.findViewById(R.id.list_content); 
     //tv.setText(str[pos]); 
     tv.setTextColor(Color.GREEN); 
    } 
    else { 
     //TextView tv = (TextView)v.findViewById(R.id.list_content); 
     //tv.setText(str[pos]); 
     tv.setTextColor(Color.RED); 
    } 

    return v; 
} 

इसके अलावा, वहाँ एक कारण आप एक सदस्य चर के रूप में v भंडारण कर रहे हैं, के बजाय सिर्फ समारोह के अंदर है?

+0

मैं वी भंडारण किया गया था क्योंकि मैंने सोचा कि मैं हो सकता है के बाद से मेरी ListView में में कुछ भी नहीं के साथ शुरू होता है, लेकिन यह समय के साथ वस्तुओं लाभ जोड़ने() विधि ओवरराइड करने के लिए की जरूरत है। –

+0

@ ब्रायन 515: आह। यह ArrayAdapter जैसे पूर्ण-विशेषीकृत क्लास को विस्तारित करने के बारे में अच्छी चीजों में से एक है। यह पहले से ही आपको जितनी भी चीज चाहिए (जैसे 'एड() '), और आप कस्टम डेटा या कस्टम व्यू जैसे अजीब बिट्स के बारे में चिंता कर सकते हैं। – erichamion

+0

मैं ListView (मैं अभी-अभी शुरुआत कर रहा हूँ) के साथ बहुत ज्यादा चारों ओर खेलने का मौका है, तो आप क्या कर रहे हैं और कैसे ListView काम करता है, मैं एक संभावित समस्या को देख सकते हैं की मेरी समझ से नहीं है किंतु। जैसा कि मैं समझता हूं, ListView दृश्यों को पुन: उपयोग करता है, इसलिए यदि आप समय के मूल्य की जांच कर रहे हैं, जब दृश्य जोड़ा जाता है, तो पुराने आइटम हरे से लाल रंग में बदल सकते हैं क्योंकि उपयोगकर्ता ऊपर और नीचे स्क्रॉल करता है। यदि ऐसा होता है, तो शायद स्ट्रिंग और वर्तमान समय दोनों को उस ऑब्जेक्ट का उपयोग करने पर विचार करें जिसमें स्ट्रिंग की बजाय स्ट्रिंग और वर्तमान समय होता है? – erichamion

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