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

Pan*_*zur 5 android recycler-adapter android-glide

我正在使用Glide库从URL加载图像,而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();
}
Run Code Online (Sandbox Code Playgroud)

dth*_*lke 6

您的“问题”是ImageView您正在使用的s 是从前一行(滚动时消失)中回收的。因此,您的ImageViewinonBindViewHolder已包含以前的图像。

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

为了避免这个问题,你必须ImageView在调用之前清除你的getEventCover. 这可以通过设置占位符图像或设置透明图像来完成,如下所示:

main_image.setImageResource(android.R.color.transparent);
Run Code Online (Sandbox Code Playgroud)

  • 这还不够。您还必须在调用 setImageResource 之前调用 Glide.clear。否则,在极少数情况下,您会在新请求完成之前看到一个随机的先前请求已完成。通常这不是必需的,因为 into() 会做同样的事情,但在这种情况下,你是异步调用 in,所以你仍然需要同步调用 clear (3认同)