2015-09-02 37 views
1

我們知道當我們在列表/網格視圖中使用ViewHolder模式時,我們使用setTag/getTag來獲取信息。但是在我的代碼中,如果我通過簡單的靜態ViewHolder替換它,它可以正常工作並顯示圖像。那麼,getTag()/setTag()有什麼用?爲什麼使用getTag/setTag當我們可以用靜態變量做同樣的事情

@Override 
public View getView(int pos, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    if(convertView == null) { 
     convertView = mInflater.inflate(R.layout.card_view, parent, false); 
     ViewHolder.image = (ImageView)convertView.findViewById(R.id.myImage); 
    } 
    // .... 
    // ... attach image here. Via library or directly. 
    // As an example I'm using Picasso 
    Picasso.with(mContext).load(mThumbIds[pos]).into(ViewHolder.image); 

    return convertView; 
} 

// static ViewHolder pattern. 
private final static ViewHolder { 
    static final ImageView image; 
} 

private int mThumbIds[] = { 
R.drawable.sample1, R.drawable.sample2 // etc... 
}; 

這裏的情況下,你需要的XML: card_view.xml

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:cardElevation="1dp" 
    android:clickable="true" 
    app:cardCornerRadius="2dp" 
    android:foreground="?android:attr/selectableItemBackground"> 

<ImageView 
      android:id="@+id/card_view" 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:src="@drawable/placeholder" 
      android:scaleType="centerCrop"/> 

</android.support.v7.widget.CardView> 
+1

顯示您實際將圖像從ViewHolder中移出的位置,這對您來說很明顯。 –

+0

如果你的列表視圖中的所有項目使用相同的圖像,這很好。然而,通常的使用模式是爲每個listview項目創建一個新的ViewHolder對象,並在listview項目上調用setTag。 –

回答

1

但在這裏我的代碼,如果我通過簡單的靜態ViewHolder替換此,它工作正常

不,它沒有。

首先,你像一個篩子一樣泄漏記憶。

其次,只要用戶滾動,您的方法就會中斷,因爲您將開始更新錯誤的ImageView。您的代碼依賴於行不會被回收的情況,只有在您的ListView/GridView不需要太多滾動,或者如果您有一個嚴重混亂的適配器試圖避免完全查看回收時,情況纔會如此。

+0

我通過放置大量圖像(來自'res/drawable')檢查了代碼。它可以正常滾動。使用200x200的圖像時,內存消耗最大爲25MB。你能解釋我如何把錯誤的'ImageView'? android如何爲同一個'ImageView'存儲不同的ID並在哪裏? –

+0

@AshishRawat:「它可以正常滾動」 - 而不是你在問題中的代碼。如果'convertView'不是'null',那麼您將使用上次'convertView'爲'null'時碰巧使用的'ImageView',並更新了您的靜態數據成員。 – CommonsWare

+0

好吧,我明白它會在'ListView'回收之前使用'convertView'的最後'ImageView'。但是我在'card_view.xml'中使用'ListView'而不是圖像。所以,我認爲靜態數據成員使用最後一個'ImageView'並不重要,因爲android只存儲該Image的一個實例(而不是'card_view.xml')。 –

相關問題