Android, Glide 显示错误图像大约一秒钟
Android, Glide shows wrong image for about one second
我正在使用 Glide 库从 URL 加载图像,这是我从 Graph Request (Facebook) 获得的。它在 RecyclerAdapter 中使用。当我滚动时,每个 ImageView 显示错误的图片大约不到一秒钟,然后更正一张。这是代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ImageView main_image = viewHolder.main_image,
getEventCover(position, main_image);
}
private void getEventCover(int position, final ImageView img){
GraphRequest request = GraphRequest.newGraphPathRequest(
AccessToken.getCurrentAccessToken(),
event.get(position).getEventID(),
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
JSONObject data = response.getJSONObject();
try {
JSONObject cover = data.getJSONObject("cover");
String source = cover.getString("source");
Glide.with(fragment)
.load(source)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.into(img);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
);
Bundle parameters = new Bundle();
parameters.putString("fields", "cover");
request.setParameters(parameters);
request.executeAsync();
}
您的 "problem" 是您使用的 ImageView
是从前几行(滚动时消失)回收的。因此,onBindViewHolder
中的 ImageView
已经包含以前的图像。
这张图片一直显示到新图片的网络请求(GraphRequest 和 Glide)完成。
为避免此问题,您必须在调用 getEventCover
之前清除 ImageView
。这可以通过设置占位符图像或设置透明图像来完成,如下所示:
main_image.setImageResource(android.R.color.transparent);
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ImageView main_image = viewHolder.main_image,
main_image.setImageURI(null);
getEventCover(position, main_image);
}
在准备(绑定)子视图以显示数据的过程中,正在从缓存中检索以前用于显示数据的(回收)视图以供重新使用。由于此过程跳过了初始布局 inflation 和构造,因此 ImageView 明显保留了它的源代码。将源设置为 null 会立即显着提高性能。
我正在使用 Glide 库从 URL 加载图像,这是我从 Graph Request (Facebook) 获得的。它在 RecyclerAdapter 中使用。当我滚动时,每个 ImageView 显示错误的图片大约不到一秒钟,然后更正一张。这是代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ImageView main_image = viewHolder.main_image,
getEventCover(position, main_image);
}
private void getEventCover(int position, final ImageView img){
GraphRequest request = GraphRequest.newGraphPathRequest(
AccessToken.getCurrentAccessToken(),
event.get(position).getEventID(),
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
JSONObject data = response.getJSONObject();
try {
JSONObject cover = data.getJSONObject("cover");
String source = cover.getString("source");
Glide.with(fragment)
.load(source)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.into(img);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
);
Bundle parameters = new Bundle();
parameters.putString("fields", "cover");
request.setParameters(parameters);
request.executeAsync();
}
您的 "problem" 是您使用的 ImageView
是从前几行(滚动时消失)回收的。因此,onBindViewHolder
中的 ImageView
已经包含以前的图像。
这张图片一直显示到新图片的网络请求(GraphRequest 和 Glide)完成。
为避免此问题,您必须在调用 getEventCover
之前清除 ImageView
。这可以通过设置占位符图像或设置透明图像来完成,如下所示:
main_image.setImageResource(android.R.color.transparent);
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ImageView main_image = viewHolder.main_image,
main_image.setImageURI(null);
getEventCover(position, main_image);
}
在准备(绑定)子视图以显示数据的过程中,正在从缓存中检索以前用于显示数据的(回收)视图以供重新使用。由于此过程跳过了初始布局 inflation 和构造,因此 ImageView 明显保留了它的源代码。将源设置为 null 会立即显着提高性能。