这个问题在这里被问到:Universal-Image-Loader: wrong Bitmaps are attached to ImageView
我使用的是最新的1.9.3。我在我的应用程序类中实现了这个解决方案:
@Override
public void onCreate() {
super.onCreate();
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().resetViewBeforeLoading(true).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.build();
ImageLoader.getInstance().init(config);
}
每Android-Universal-Image-Loader doesn't keep loaded images on scroll in gridview,我在我的适配器中加载图像:
ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
ImageLoader.getInstance().displayImage(imgUrl, imageAware);
它仍然无法运作;我想知道是不是因为我必须打电话来获取图片网址,因为提供模型数据的api不包含图片网址。
所以在我的适配器的getView()中,在我使用带有图片网址的imageloader之前,我再做一次异步调用来获取图片网址,如下所示:
APIclient.getImageJson(getContext(), googleUrl, new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject imgJson) {
try {
JSONObject responseDataValue = imgJson.getJSONObject("responseData");
JSONArray resultsValue = responseDataValue.getJSONArray("results");
JSONObject result = resultsValue.getJSONObject(0);
String imgUrl = result.getString("url");
ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
ImageLoader.getInstance().displayImage(imgUrl, imageAware);
//ImageLoader.getInstance().displayImage(imgUrl, viewHolder.profileIV);
}
catch(Exception e) {
e.printStackTrace();
}
}
这里的google网址如下:https://ajax.googleapis.com/ajax/services/search/images?rsz=1&start=1&v=1.0&q=%22barack%20obama%22
由于名称不同,每行会有不同的URL。我不知道问题是否仍然是一个listview recycer问题,这个问题在通用图像加载程序库中没有修复,或者罪魁祸首在于附加的网络调用。如何使缩略图与旁边的数据保持一致?
答案 0 :(得分:-1)
我认为这是因为APIclient.getImageJson(...)
中的异步通话getView()
。在onSuccess()
回调被解雇时,这是未知的时间,因此您可以为已经回收的ImageLoader.getInstance().displayImage(...)
致电ImageView
。
我可以建议你加入这两个异步操作(通过APIclient获取JSON,通过ImageLoader加载图像)。实现自己的ImageDoanloader,它将处理谷歌JSON URL(https://ajax.googleapis.com/ajax/services/search/images?rsz=1&start=1&v=1.0&q=%22barack%20obama%22),提取图像URL和加载图像。
让我们介绍一下我们自己的URI方案 - “json”。所以我们知道像“json:// ...”这样的传入URI对应于JSON链接。
准备自己的下载器:
public class JsonImageDownloader extends BaseImageDownloader {
public static final String SCHEME_JSON = "json";
public static final String SCHEME_JSON_PREFIX = SCHEME_JSON + "://";
public JsonImageDownloader(Context context) {
super(context);
}
public JsonImageDownloader(Context context, int connectTimeout, int readTimeout) {
super(context, connectTimeout, readTimeout);
}
@Override
public InputStream getStream(String uri, Object extra) throws IOException {
if (uri.startsWith(SCHEME_JSON_PREFIX)) {
String jsonUri = uri.substring(SCHEME_JSON_PREFIX.length());
JSONObject imgJson = APIclient.getImageJson(context, jsonUri); // sync JSON loading
try {
JSONObject responseDataValue = imgJson.getJSONObject("responseData");
JSONArray resultsValue = responseDataValue.getJSONArray("results");
JSONObject result = resultsValue.getJSONObject(0);
String imgUrl = result.getString("url");
return super.getStream(imgUrl, extra);
} catch (JSONException e) {
throw new RuntimeException(e);
}
} else {
return super.getStream(uri, extra);
}
}
}
将其设置为配置
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.imageDownloader(new JsonImageDownloader(context))
....
.build();
在getView(...)
中使用ImageLoader而不使用APIclient
:
ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
ImageLoader.getInstance().displayImage("json://" + googleUrl, imageAware);