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
的lastImageView
。但是我正在膨胀card\u view.xml
而不是带有列表视图的图像。因此,我认为静态数据成员是否使用lastImageView
无关紧要,因为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>