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 接管加载那张图片。
我使用 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 一次,然后它将自身附加到