2010-08-04 8 views
5

मेरे पास एक कस्टम सरणीकरण के साथ एक सूचीदृश्य है जो लगभग 15 तारों को संभालता है। प्रत्येक पंक्ति की शैली वैकल्पिक होती है (उन लेबलों के लिए लेबल और मानों के बीच - उदाहरण के लिए पंक्ति 1 "ईमेल पता" हो सकता है और पंक्ति 2 वास्तविक ईमेल पता होगा)। मैं सरणीकरण की getView() विधि में इस तरह की वैकल्पिक रूप से प्रत्येक पंक्ति की शैली बदल रहा हूं। तो यदि वर्तमान स्थिति में आइटम एक लेबल है, तो मैं स्टाइल को डिफ़ॉल्ट पंक्ति शैली से बदल दूंगा (जो वैल्यू उन पर लागू होता है)। जब सूचीदृश्य पहले लोड होता है, स्टाइल सही है और मैं इसे कैसे बनना चाहता हूं। यदि मैं सूची को धीरे-धीरे ऊपर या नीचे स्क्रॉल करता हूं, तो वह उस तरह से रहता है। हालांकि, अगर मैं सूची को ऊपर और नीचे स्क्रॉल करता हूं, तो मूल्य पंक्तियों की स्टाइल लेबल के उसमें बदलना शुरू हो जाती है जब तक कि सभी पंक्तियों में लेबल पंक्ति की स्टाइल न हो। क्या किसी को पता है कि यह क्यों हो रहा है? मैंने ऐप में अन्य सूचीदृश्यों पर कस्टम एडेप्टर का उपयोग किया है, इस तरह की कोई समस्या नहीं है।जब मैं एक कस्टम एडाप्टर के साथ एक सूची दृश्य को तेज़ी से ऊपर और नीचे स्क्रॉल करता हूं, getView() अजीब व्यवहार करना शुरू कर देता है। क्यूं कर?

संपादित करें: यह पता चला है कि यह पोर्ट्रेट-> परिदृश्य अभिविन्यास परिवर्तनों पर लेबल स्टाइल में सभी पंक्तियों को भी बदलता है। यह परिदृश्य पर नहीं करता-> चित्र परिवर्तन। नीचे मैं एडाप्टर का उपयोग कर रहा हूँ। क्या मैं कुछ भूल रहा हूँ?

public class DetailsAdapter extends ArrayAdapter<String> { 

private TextView text = null; 
private String item = null; 

public DetailsAdapter(Context context, int resource, int textViewResourceId, String[] objects) { 
    super(context, resource, textViewResourceId, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    text = (TextView) super.getView(position, convertView, parent); 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     text.setBackgroundColor(0xFF575757); 
     text.setTextSize(15); 
     text.setTypeface(null, Typeface.BOLD); 
     text.setPadding(8, 5, 0, 5); 
    } else { 
     text.setPadding(15, 15, 0, 15); 
    } 
    return text; 
} 

@Override 
public boolean isEnabled(int position) { 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     return false; 
    } else { 
     return true; 
    } 
} 
} 
+0

क्या आप अपना getView कोड दिखा सकते हैं? –

+0

आरंभ में सूचीदृश्य लोड होने पर कितनी पंक्तियां प्रस्तुत की जाएंगी। कस्टमडाप्टर की गेटव्यू विधि का उपयोग कर एक पंक्ति के लिए दृश्य बनाना कुछ हद तक अत्यधिक स्मृति गहन कार्य है। यह आपके लेबल के झुकाव प्रतिपादन का कारण है। अपने कोड की झलक लिखें .. क्या आपको एक समाधान मिल सकता है –

उत्तर

7

एंड्रॉयड विचारों पुनः उपयोग कर लेता काफी आक्रामक तरीके से, और यह काफी संभव है कि एक विचार है कि एक ईमेल पता पंक्ति के रूप में इस्तेमाल किया गया था कि एक पंक्ति लेबल प्रदर्शित चाहिए था पर पुन: उपयोग किया जाता है, और उपाध्यक्ष प्रतिकूल।

नतीजतन, आप "डिफ़ॉल्ट" मानों पर भरोसा नहीं कर सकते हैं। सभी मामलों में अपने पैडिंग, टाइपफेस, टेक्स्ट आकार और पृष्ठभूमि रंग को सेट करें:

if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
    text.setBackgroundColor(0xFF575757); 
    text.setTextSize(15); 
    text.setTypeface(null, Typeface.BOLD); 
    text.setPadding(8, 5, 0, 5); 
} else { 
    text.setBackgroundColor(DEFAULT_BACKGROUND); 
    text.setTextSize(DEFAULT_TEXT_SIZE); 
    text.setTypeface(null, DEFAULT_TYPEFACE); 
    text.setPadding(15, 15, 0, 15); 
} 
+0

यह काम किया - धन्यवाद। पता नहीं क्यों मैंने कोशिश नहीं की ... – oliverwhite

+0

"आक्रामक" एक सटीक शब्द है, मैं कहूंगा! मुझे हाल ही में इस बग द्वारा काट दिया गया है - जिसे मैं एंड्रॉइड में कहूंगा। यह देखने के लिए समझ में आता है कि ऑन-स्क्रीन पर आने वाले दृश्य के रूप में दृश्य ऑफ-स्क्रीन का पुन: उपयोग करना है, लेकिन एक डेवलपर जिसने getView() में पंक्तियों को दोबारा सुधार दिया है, उसे यह जानने की उम्मीद नहीं की जा सकती है! हालांकि, इसके लिए ArrayAdapter या SimpleAdapter का अर्थ नहीं था। – electromaggot

+1

तो मारियस की टिप्पणी पर +1! एक बात यह है कि मैं सुझाव दूंगा कि पंक्ति के शुरुआती मूल्यों को बनाए रखने के लिए "saveFormat()" और "restoreFormat()" विधियों को बनाना है ("डिफ़ॉल्ट" जो कि Marius का जिक्र कर रहा है)। यह भविष्य के रखरखाव को कम करेगा, क्योंकि पंक्ति प्रारूप हमेशा XML में एक स्थान पर डिफ़ॉल्ट होगा। – electromaggot

4

कुछ भी करने की आवश्यकता नहीं है। मैं भी एक ही समस्या का सामना करना पड़ा और इस तरह इसे हल:

बस getView विधि के अंदर एक पहली पंक्ति

convertView=null; 
जोड़ने

यह अभ्यस्त दृश्य तुरंत नष्ट कर हर बार पुनः बनाने लेकिन इसके बजाय नए बनाने के आधार पर अपने तर्क (यहां तक ​​कि विषम या जो कुछ भी)

+0

इसने मेरे लिए समस्या हल की लेकिन सूचीदृश्य अविश्वसनीय रूप से लगी। –

+0

मुझे लगता है कि यह सही जवाब होना चाहिए। मेरा अंतराल नहीं हुआ (हालांकि यह वास्तव में जटिल नहीं है)। –