2010-08-04 25 views
5

我有一個自定義arrayadapter,處理大約15個字符串的列表視圖。每行的樣式交替出現(標籤和這些標籤的值之間 - 例如,第1行可以是「電子郵件地址」,第2行將是實際的電子郵件地址)。我在arrayadapter的getView()方法中改變了每行的樣式以便像這樣交替。因此,如果當前位置的項目是一個標籤,我將從默認的行樣式(這是值應用於它們的樣式)更改樣式。當第一次加載列表視圖時,樣式是完美的,而且我希望它是如何。如果我慢慢向上或向下滾動列表,它會保持這種狀態。但是,如果我快速向上和向下滾動列表,則值行的樣式開始變爲標籤行的樣式,直到所有行都具有標籤行的樣式。有誰知道爲什麼會發生這種情況?我在應用程序的其他列表視圖中使用了自定義適配器,而沒有像這樣的問題。當我用自定義適配器上下滾動listview時,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代碼嗎? – 2010-08-04 22:07:08

+0

最初在加載listview時會顯示多少行。使用customadapter的getview方法爲一行創建一個視圖是一項內存密集型任務。這是混亂渲染標籤的原因。 寫你的代碼瞥見..可能是你得到一個解決方案 – 2010-08-05 12:50:39

回答

7

的Android重用的看法相當積極,而且很可能是被用作電子郵件地址列視圖得到重用上的應該顯示標籤的行,反之亦然。

因此,您不能依賴「默認」值。在所有情況下設置填充,字體,文字大小和背景色:

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 2010-08-06 15:57:32

+0

「積極」是一個準確的術語,我會說!我最近被這個bug所困擾 - 我將其稱爲Android。對於他們重新使用視圖在屏幕上作爲視圖進行重新使用是合理的,但在getView()中重新格式化行的開發人員不能期望知道這一點!但是,也許ArrayAdapter或SimpleAdapter並不適用於此。 – electromaggot 2011-02-17 11:57:47

+1

所以+1對Marius的評論!我建議的一件事是使「saveFormat()」和「restoreFormat()」方法保留行的初始值(Marius所指的「默認值」)。這將減輕將來的維護,因爲行格式將始終默認爲XML中的一個位置。 – electromaggot 2011-02-17 12:18:25

4

不需要做任何事情。我也遇到同樣的問題,解決了這個問題是這樣的:

就在getView方法中添加第一線

convertView=null; 
基於

它不會每次重繪立即銷燬視圖,而是會創建新的你邏輯(甚至是奇數或其他)

+0

這解決了我的問題,但使列表視圖令人難以置信的laggy。 – 2013-02-28 18:41:59

+0

對我來說,這應該是正確的答案。我沒有滯後(雖然事實並非如此複雜)。 – 2016-06-08 06:21:38

相關問題