ListView 重用旧图像

ListView reusing old images

我使用 Picasso and it uses the android.widget.ImageView 创建了一个插件来加载缓存图像。 如果使用 Repeater,该插件工作正常,但每当我在滚动超过第 7 个项目后尝试将它与 ListView 一起使用时,即使图像源不同,ListView 也会开始重用旧图像

之所以是因为列表视图重用了整个片段;所以发生的事情是,除非您清除它,否则您的 img 被重复使用会显示旧图像。

其实我自己也在用Picasso;这是我目前的毕加索图书馆。 因此,如果您查看下面的代码,当我设置新的 .url 时,我会清除现有图像。 (我在特定行上做了评论)——这样图像现在显示为空白,然后毕加索从内存、磁盘或远程 url 加载它(在我的例子中是远程 url)它将分配正确的图像。

"use strict";

var Img = require('ui/image').Image;
var application = require("application");

var PT = com.squareup.picasso.Target.extend("Target",{
    _owner: null,
    _url: null,
    onBitmapLoaded: function(bitmap, from) {
        // Since the actual image / target is cached; it is possible that the
        // target will not match so we don't replace the image already seen
        if (this._url !== this._owner._url) {
            return;
        }
        this._owner.src = bitmap;
    },
    onBitmapFailed: function(ed) {
        console.log("Failed File", this._url);
    },
    onPrepareLoad: function(ed) {

    }
});

Object.defineProperty(Img.prototype, "url", {
    get: function () {
        return this._url;
    },
    set: function(src) {
        if (src == null || src === "") {
            this._url = "";
            this.src = null;
            return;
        }
        var dest = src;
        this._url = dest;
        this.src = null; // -- THIS IS THE LINE TO CLEAR THE IMAGE
        try {
            var target = new PT();
            target._owner = this;
            target._url = dest;
            var x = com.squareup.picasso.Picasso.with(application.android.context).load(dest).into(target);
        } catch (e) {
            console.log("Exception",e);
        }
    },
    enumerable: true,
    configurable: true
});

请注意,您只需要这个 class 一次,然后它将自身附加到 组件并添加新的 .url 属性;这允许我在所有其余屏幕的声明 XML 中使用它,当我需要 picasso 时,我只需使用 .url 属性 让 picasso 接管加载那张图片。