Recyclerview适配器和Glide - 每4-5行相同的图像

问题描述 投票:34回答:5

我有这个问题 - 仅仅是为了测试目的我将ParseFile添加到收到列表中的ParseObject之一。它不是仅显示在该行中,而是显示每4-5行,有时更多,有时更少。我认为回收视图与此有关。奇怪的是,其他数据(从这个例子中删除)与position变量一起工作正常。

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context)
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context))
                    .into(holder.imageView);


        }

    }
android parse-platform android-recyclerview recycler-adapter android-glide
5个回答
72
投票

这里的答案是不正确的,尽管它们在正确的轨道上。

你需要调用Glide#clear(),而不仅仅是将drawable图像设置为null。如果您不调用clear(),则无序完成的异步加载可能仍会导致视图回收问题。您的代码应如下所示:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) {
    if (parseList.get(position).get("logo") != null) {
        ParseFile image = (ParseFile) parseList.get(position).get("logo");
        String url = image.getUrl();
        Glide.with(context) 
                .load(url)
                .placeholder(R.drawable.piwo_48)
                .transform(new CircleTransform(context)) 
                .into(holder.imageView);
    } else {
        // make sure Glide doesn't load anything into this view until told otherwise
        Glide.clear(holder.imageView);
        // remove the placeholder (optional); read comments below
        holder.imageView.setImageDrawable(null);
    }
} 

2
投票

也许你需要尝试这样的事情

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

样品:

Glide.with(context)
                .load(url)
                .placeholder(R.drawable.progress_animation)
                .crossFade()
                .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
                .error(R.drawable.image_error_404)
                .into(iv);

1
投票

当“徽标”为空时,您将获得回收的图像而不是清除它。添加此代码以正确清除图像:

holder.imageView.setImageDrawable(null);

1
投票

RecyclerView中,每行都会使用新数据进行回收。在你的代码中,你只设置ImageView,而不是null,否则什么都不做。在这种情况下,当它不是null时,ImageView将显示旧图像,因为你没有为当前对象使用override。您可以通过添加else条件并将ImageView设置为null / blank来解决此问题。

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context) 
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context)) 
                    .into(holder.imageView);


        } 
        else{
            holder.imageView.setImageDrawable(null);
        }
    } 

1
投票

我认为这是因为您的适配器具有adapter.setHasStableIds(true)为true且未覆盖getItemId。因此,recyclerView尝试查找具有相同ID的持有者并重复使用它。

© www.soinside.com 2019 - 2024. All rights reserved.