Android,Glide显示错误的图像大约一秒钟

时间:2016-07-07 16:44:14

标签: android recycler-adapter android-glide

我使用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();
}

2 个答案:

答案 0 :(得分:3)

你的问题"是你正在使用的ImageView是从以前的行(在滚动时消失)中回收的。因此,ImageView中的onBindViewHolder已包含上一张图片。

此图像一直显示,直到新图像的网络请求(GraphRequest和Glide)完成。

要避免此问题,您必须在致电ImageView之前清除getEventCover。这可以通过设置占位符图像或设置透明图像来完成,如下所示:

main_image.setImageResource(android.R.color.transparent);

答案 1 :(得分:2)

@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);

        }

在准备子视图以显示数据的(绑定)过程中,从高速缓存中检索先前用于显示数据的(再循环)视图以供重用。由于此过程会跳过初始布局膨胀和构造,因此ImageView显然保留了它的来源。将源设置为null会立即显着提高性能。