picasso:如何取消适配器中的所有图像请求

ter*_*rry 11 android picasso

像往常一样,我们使用适配器来填充listView.在适配器中我们使用picasso来加载图像.我看到,当将图像加载到目标(imageView)时,行会被回收,毕加索会自动取消对该目标的请求.

如何在离开片段或活动时取消所有未完成的请求?

sfe*_*era 27

这个答案可能会有点晚,但也许有人仍然需要它......

定义一个ViewHolder提供清理方法:

static class ImageHolder extends RecyclerView.ViewHolder {
    public final ImageView image;

    public ImageHolder(final View itemView) {
        super(itemView);
        image = (ImageView) itemView.findViewById(R.id.image);
    }

    public void cleanup() {
        Picasso.with(image.getContext())
            .cancelRequest(image);
        image.setImageDrawable(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

onViewRecycled()在您的适配器中实现:

static class ImageAdapter extends RecyclerView.Adapter<ImageHolder> {

    // ...

    @Override
    public void onViewRecycled(final ImageHolder holder) {
        holder.cleanup();
    }
}
Run Code Online (Sandbox Code Playgroud)

当您的Fragment视图被销毁时(或者您希望的时候)取消Picasso请求:

public class MyFragment extends Fragment {
    private RecyclerView recycler;

    // ...

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        recycler.setAdapter(null); // will trigger the recycling in the adapter
    }
}
Run Code Online (Sandbox Code Playgroud)

RecyclerView.setAdapter(null)将分离所有当前添加的Views及其相关的ViewHolders将被回收.


And*_*n K 1

但前提是您不在列表/网格适配器中!请求相同图像视图/目标的图像(例如,在适配器 getView 中)将自动执行此操作。如果您提出请求然后离开屏幕,则只需取消(实际上不需要)。

https://github.com/square/picasso/issues/83