Android - 如何在滚动时停止在Recyclerview中重新加载图像

skd*_*134 11 android android-recyclerview

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

每当我向下滚动时,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);               
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以.fit()与毕加索一起使用。希望能解决你的问题

Picasso.with(persons.get(i).context)
    .load(persons.get(i).photoId)
    .placeholder(R.drawable.placeholder)
    .fit()
    .into(personPhoto);
Run Code Online (Sandbox Code Playgroud)


sim*_*dam 2

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

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

重载部分

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

特别要指出的是 - 通用图像默认情况下没有启用缓存,您可以通过这种方式打开它。

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

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