Android - 滚动

时间:2015-05-14 11:46:56

标签: android android-recyclerview

我正在创建一个用于从网上加载图片的应用程序。我正在使用Recyclerview进行上市。为了下载图像,我尝试了毕加索,通用图像下载和其他自定义方法,但我遇到了这个问题:

每当我向下滚动时,imageview中的图像都会重新加载。我甚至保留了一个条件来检查imageview是否包含图像,但是它似乎也没有用,或者我的代码可能有问题。但我无法找到解决这个问题的方法。下面我附上了' onBindViewHolder'我认为代码的功能是有问题的部分。这里的图像是一个包含图像网址的字符串arraylist。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.default_card, parent, false);

        ViewHolder viewHolder;
        viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {            
        String url = images.get(position);

        if (holder.imgView.getDrawable() != null) {
            //Do Nothing
        } else {                
            ImageLoader.getInstance().displayImage(url, holder.imgView);               
        }
    }

4 个答案:

答案 0 :(得分:3)

您可以将.fit()与Picasso一起使用。希望能解决您的问题

Picasso.with(persons.get(i).context)
    .load(persons.get(i).photoId)
    .placeholder(R.drawable.placeholder)
    .fit()
    .into(personPhoto);

答案 1 :(得分:2)

首先,您的代码中存在错误 - 您必须从onBindViewHolder中删除该条件。每次要显示时,都必须更新所有ImageView个实例。

@Override
public void onBindViewHolder(ViewHolder holder, int position) {            
    String url = images.get(position);               
    ImageLoader.getInstance().displayImage(url, holder.imgView);               
}

重新加载部分

问题是,您可能没有使用任何缓存(内存或基于磁盘)。我不会对此进行详细说明,在集合视图中缓存图像是一个非常常见的问题,我确信快速的StackOverflow搜索会给你带来很多结果。

特别是 - 通用图片does not have caching enabled by default您可以通过这种方式转换它。

DisplayImageOptions options = new DisplayImageOptions.Builder()
    ...
    .cacheInMemory(true)
    .cacheOnDisk(true)
    ...
    .build();
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); // Incoming options will be used

或者您可以为您的应用程序全局设置它,只需查看文档。

答案 2 :(得分:0)

如果您不想使用缓存,可以使用setItemViewCacheSize(size)并提及您不想重新加载的大小。就是这样。 Recyclerview版本24.0.0

答案 3 :(得分:0)

您可以使用它来解决您的问题。

mRecyclerView.getRecycledViewPool().setMaxRecycledViews(0, 0);