首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回收视图适配器和幻灯片-每4-5行相同的映像。

回收视图适配器和幻灯片-每4-5行相同的映像。
EN

Stack Overflow用户
提问于 2015-09-21 23:49:45
回答 5查看 57.3K关注 0票数 46

我遇到了这个问题--只是为了测试目的,我从接收到的列表中将ParseFile添加到了ParseObject中。它不是只显示在该行中,而是每4-5行显示一次,有时更多,有时更少。我认为回收利用的观点与此有关。奇怪的是,其他数据(从本例中删除)可以很好地处理position变量。

代码语言:javascript
复制
@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);


        }

    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-24 16:39:35

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

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

代码语言:javascript
复制
@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.with(context).clear(holder.imageView);
        // remove the placeholder (optional); read comments below
        holder.imageView.setImageDrawable(null);
    }
} 
票数 88
EN

Stack Overflow用户

发布于 2017-02-15 11:23:36

也许你该试试这样的方法

代码语言:javascript
复制
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

样本:

代码语言:javascript
复制
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);
票数 4
EN

Stack Overflow用户

发布于 2015-09-21 23:57:26

RecyclerView中,每一行都使用新的数据进行回收。在您的代码中,您只在ImageView不是null时才设置它,否则什么也不做。在本例中,当它不是空时,ImageView将显示旧图像,因为您没有对当前对象进行override。您可以通过添加其他条件并将ImageView设置为空/空白来修复此问题。

代码语言:javascript
复制
@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);
        }
    } 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32706246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档