android - 如何避免 ListView 中的图像闪烁

标签 android image android-imageview universal-image-loader

我有一个显示一堆图像的列表。我正在使用 Universal Image Loader 将此图像从文件加载到 ImageView 。

这些图片有不同的尺寸,我希望所有图片都具有相同的宽度但每个图片的纵横比不同。

为此,我尝试将以下内容设置到我的 imageview

<ImageView
   android:layout_width = "400dp"
   android:layout_height="wrap_content"
   android:scaleType="centerCrop"
   android:adjustViewBounds="true"/>

此方法的问题是滚动 ListView 时会出现很多闪烁,因为事先不知道 ImageView 的高度,并且必须先使用我的宽度缩放图像以计算每个图像相对于这是纵横比

如何预先计算每个图像的高度而不是让 imageview 处理它?<​​/p>

如果我有一个 400 X 700 的图像,并且我希望 imageview 的宽度为 300px,我如何使用我的图像尺寸计算 imageview 的高度并保持图像纵横比?这有助于避免在滚动 ListView 时出现闪烁。

最佳答案

出现这种闪烁的原因是,在 ListView 中,列表项被重复使用。重新使用时,列表项中的 ImageView 保留首先显示的旧图像引用。稍后,一旦下载了新图像,它就会开始显示。这会导致闪烁行为。 为避免此闪烁问题,请在重新使用 ImageView 时始终清除旧图像引用。

在您的情况下,在 holder = (ViewHolder) convertView.getTag();

之后添加 holder.image.setImageBitmap(null);

因此,您的 getView() 方法将如下所示:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ...

    if (convertView == null) {
        LayoutInflater inflater = getLayoutInflater();
        convertView = inflater.inflate(viewResourceId, null);

        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
        holder.image.setImageBitmap(null)
    }

    ...

    return convertView;
}

关于android - 如何避免 ListView 中的图像闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36013709/

相关文章:

java - 代码不通过 Volley 向 mysql 发送数据

java - RecyclerView.Adapter 中的 getRef(position).getKey()

android - 如何在 aidl 文件中返回 hashmap

javascript - 调整浏览器窗口大小时,缩放图像而不是在图像周围环绕文本

android - 如何在 Android 中翻转 ImageView?

java - Android 7 英寸平板电脑 480x800

django - 将图像写入 Django HttpResponse() 的最佳方法

java - 在android中膨胀类ImageView时出错

android - 如何在android中为imageview添加微光效果?

html - 为什么我的网页图像在 HTML 中显示为横向,但在全屏时显示正确?