Android 当我们可以对静态变量执行相同操作时,为什么要使用getTag/setTag呢

Android 当我们可以对静态变量执行相同操作时,为什么要使用getTag/setTag呢,android,listview,android-viewholder,Android,Listview,Android Viewholder,我们知道,当我们在列表/网格视图中使用ViewHolder模式时,我们使用setTag/getTag来获取信息。但在我的代码中,如果我通过简单的静态ViewHolder替换它,它可以正常工作并正确显示图像。那么,getTag()/setTag()有什么用呢 以下是xml,以备您需要: card_view.xml <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/

我们知道,当我们在列表/网格视图中使用
ViewHolder
模式时,我们使用setTag/getTag来获取信息。但在我的代码中,如果我通过简单的静态ViewHolder替换它,它可以正常工作并正确显示图像。那么,
getTag()/setTag()
有什么用呢

以下是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>

但在我的代码中,如果我通过简单的静态ViewHolder替换它,它就可以正常工作

不,没有

首先,你像筛子一样泄漏内存


其次,一旦用户滚动,您的方法就会中断,因为您将开始更新错误的
ImageView
。您的代码依赖于这样一个事实,即行永远不会被回收,这只有在
列表视图
/
网格视图
不需要太多滚动,或者如果您有一个严重混乱的适配器,试图完全避免视图回收的情况下才是正确的。

显示您从ViewHolder中实际获取图像的位置,如果listview中的所有项目都使用相同的图像,这是很好的。然而,通常的使用模式是为每个listview项目创建一个新的ViewHolder对象,并在listview项目上调用setTag。我通过放置大量图像(从
res/drawable
)来检查代码。它可以很好地滚动。对于200x200映像,内存消耗最大为25MB。你能解释一下我是怎么把图像视图弄错的吗?android如何为同一个
ImageView
存储不同的ID以及在哪里?@AshishRawat:“滚动很好”——而不是你问题中的代码。如果
convertView
不是
null
,您将使用上次
convertView
null
并且您更新了静态数据成员时碰巧使用的
ImageView
,我知道它将在
ListView
回收之前使用
convertView
的last
ImageView
。但是我正在膨胀
card\u view.xml
而不是带有
列表视图的图像。因此,我认为静态数据成员是否使用last
ImageView
无关紧要,因为android只存储该图像的一个实例(而不是
card\u view.xml
)。@AshishRawat:“但我正在膨胀card\u view.xml,而不是带有ListView的图像”-
card\u view.xml
包含一个
ImageView
。每次对布局进行充气时,都会得到一个新的
ImageView
。“android只存储该图像的一个实例”--如果“图像”指的是
ImageView
,那么列表或网格单元格中的每行或单元格中都会有一个
ImageView
(加上可能更多的,以便对滚动事件做出快速反应)。我发现了问题。这不是内存问题。您是对的,
ImageView
的单个实例在
ListView
中影响回收。我重复了300多张图片,并慢慢滚动。我看到当列表从屏幕上消失时,图像会随机变化。
<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>