2010-07-07 130 views
8

我已閱讀關於多次調用getView的問題和所有答案。但是,我沒有找到解決我的問題的方法。Android適配器多個getView

我有一個列表,其中行有兩個狀態:讀或不。那麼,我想第一次看到的項目有不同的顏色,當我滾動列表,他們改變他們的顏色爲「閱讀狀態」。

爲了做到這一點,在我的適配器的getView方法中,當該項目的行被繪製時,我設置了一個字段isRead。但問題在於:由於方法getView被多次調用,因此該字段被標記爲已讀,並且當列表顯示在屏幕中時,顯示爲已經被讀取。

任何想法解決這個問題?

謝謝

回答

14

我假設你的意思是多次請求相同視圖的getView問題。

的ListView這樣做,因爲它需要獲得不同的原因的看法測量(滾動條大小,佈局等)

這個問題通常可以通過不使用你的列表視圖「WRAP_CONTENT」屬性來避免。

除此之外,使用getView來確定視圖是否已被顯示是一個壞主意。 ListView有很多優化,每個行都會調用getView命令,因此無法知道會發生什麼,並且您的應用程序將開始顯示奇怪的行爲。

儘量避免視圖和數據之外的視圖概念之間的任何關係作爲數據的顯示。

取而代之的是,在listactivity中有一些工作線程或事件偵聽器,查看列表中的哪些項目已顯示給用戶,更新數據並在適配器上調用dataSetChanged。

+0

「更新數據,並調用dataSetChanged您的適配器」 - 爲我的作品 – 2013-08-22 06:55:42

0

不是你想讓它工作的方式。多次調用getView()的原因是爲了讓操作系統測量行,以便知道如何佈置它們。您需要將它標記爲已讀或點擊時選中或選中某個框。

1

我有同樣的問題,我根本沒有參考佈局attirbute中的「wrap_content」。雖然這是一個古老的線程,但我無法弄清楚如何解決這個問題。因此,我通過在適配器中添加一個包含已經繪製位置的List來緩解它,如下面的代碼所示。我認爲這不是馬上做到這一點,但它對我有用。

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 
    private List<Integer> usedPositions = new ArrayList<Integer>(); 

    public ImageAdapter(Context c, List<String> imageUrls) { 
     mContext = c; 
     ... 
    } 

    ... 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     if (!usedPositions.contains(position)) { 
      // Your code to fill the imageView object content 
      usedPositions.add(position); // holds the used position 
     } 

     return imageView; 
    } 
} 
0

這是避免雙重調用的一種非常簡單的方法,當您在該代碼塊下面什麼都不知道時會扭曲佈局。

private static List<String> usedPositions = new ArrayList<String>(); 

...

@Override 
public View getView(int position, View rowView, ViewGroup parent) { 
    rowView = inflater.inflate(R.layout.download_listview_item, null); 

    Log.d(LOG_TAG, "--> Position: " + position); 

    if (!usedPositions.contains(String.valueOf(position))){ 
     usedPositions.add(String.valueOf(position)); 
     return rowView; 
    }else{ 
     usedPositions.remove(String.valueOf(position)); 
    } 

...

相關問題