【问题标题】:Glide reload content on scrolling in listview在列表视图中滚动时滑动重新加载内容
【发布时间】:2018-06-11 00:54:55
【问题描述】:

我正在使用 glide 加载内容,我使用它在页面中加载 1 张图像,如果我关闭并重新打开我的应用程序,它会正常工作。问题是当我在 listview 上使用它时,glide 总是重新下载它。
详细错误步骤:

  1. 从服务器加载内容后,所有图像显示正常
  2. 然后我向下滚动,新内容也正常显示
  3. 当我向后滚动时,所有图像都消失了,但 1 秒后我的图像再次出现,因为滑行加载它就像滑行从未加载过一样。
  4. 如果我是纵向的,第一次加载时,它将填充布局宽度,但第二次(回滚列表视图)图像看起来更小而不是全宽。

这是我截取的代码

View view = convertView;
if (null == view) {
    view = View.inflate(parent.getContext(), R.layout.item, null);
}

ImageView ivAvatar = (ImageView) view.findViewById(R.id.iv_avatar);
ImageView ivPicture = (ImageView) view.findViewById(R.id.iv_picture);
TextView tvName = ....
...
tvName.setText(.....);  

Glide.with(parent.getContext()).load(Api.getUrlImage(contents.get(position).avatar, 50, 0)).into(ivAvatar);
Glide.with(parent.getContext()).load(Api.getUrlImage(contents.get(position).picture, 400, 0)).into(ivPicture);

在第 3 点,它就像一个闪烁,但图像视图失去了它的高度。图像下方的文字向上(就像那里没有图像视图)然后在滑行完成加载图像后返回
在第 4 点,我的屏幕分辨率为 480 像素,我加载了 400 像素的图像(由服务器调整大小),如第二个滑行代码所示。

我的问题,如何去除这个闪烁的图像?

*我在低规格设备和高规格设备(samsung tab s)上运行它,并且在两个设备上都发生闪烁

【问题讨论】:

    标签: android image android-glide


    【解决方案1】:

    在你的适配器的onCreateView方法中使用滑行之前尝试使用if

    喜欢这个

    if (yourImageView.getDrawable() == null)
    // load your image 
    

    所以如果图像已经加载,该方法不返回 null

    【讨论】:

    • @NameSurname 欢迎兄弟
    • 这将留下之前加载的图像,这是错误的。 ViewHolders 被重用,无论视图持有者在哪里以及它用于哪些数据,你只会看到第一个加载的图像。
    • @Sermilion 您可以在视图回收时从视图中删除图像,显示 onViewRecycled 方法
    【解决方案2】:

    尝试使用 dontAnimate() 看看是否能解决问题?

    如果问题依然存在,那是因为 Glide 释放了之前图片的资源,以便加载后续图片。

    如果您要在滚动列表中加载大量图像并且需要支持低规格设备,那么 fresco 是更好的选择。 http://frescolib.org/index.html 它使用本机内存并具有更好的位图资源管理,尤其是对于 5.0 之前的 Android 设备。

    【讨论】:

    • 我只是尝试实现 frescolib,根据需要工作。仅供参考,我认为它在我的代码中关于图像高度的错误,直到阅读此frescolib.org/docs/wrap-content.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多