as usual we use an adapter to populate a listView. in the adapter we use picasso to load the images. i see that as rows are recycled when loading an image into an target (imageV
This answer may come a bit late, but maybe someone still needs it...
Define a ViewHolder
which provides a cleanup method:
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);
}
}
Implement onViewRecycled()
in your adapter:
static class ImageAdapter extends RecyclerView.Adapter {
// ...
@Override
public void onViewRecycled(final ImageHolder holder) {
holder.cleanup();
}
}
Cancel the Picasso requests when your Fragment's view is destroyed (or whenever you wish):
public class MyFragment extends Fragment {
private RecyclerView recycler;
// ...
@Override
public void onDestroyView() {
super.onDestroyView();
recycler.setAdapter(null); // will trigger the recycling in the adapter
}
}
RecyclerView.setAdapter(null)
will detach all currently added View
s and their associated ViewHolder
s will be recycled.