glide和RecyclerView版本:
implementation 'com.github.bumptech.glide:glide:3.8.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
列表適配器代碼
//未封裝adapter
public class GridAdapterNoPack extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private LayoutInflater mLayoutInflater;
List<SearchResultItem> list;
public GridAdapterNoPack(Context context, List<SearchResultItem> list) {
mLayoutInflater = LayoutInflater.from(context);
this.list = list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.grid_item, parent, false);
ItemViewHolder viewHolder = new ItemViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if (position < list.size()) {
ImageView iv = ((ItemViewHolder) holder).mContentTv;
Glide.with(iv.getContext())
.load(list.get(position).getPgrpLogo())
.placeholder(R.mipmap.epg_bg)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
Log.e("Glide", " position:" + position + " onResourceReady");
return false;
}
})
.into(iv);
holder.itemView.setTag(position);
}
}
@Override
public int getItemCount() {
return this.list.size();
}
class ItemViewHolder extends RecyclerView.ViewHolder {
private ImageView mContentTv;
ItemViewHolder(View itemView) {
super(itemView);
mContentTv = itemView.findViewById(R.id.video_image);
}
}
void add(List<SearchResultItem> list, boolean b) {
this.list.addAll(list);
notifyDataSetChanged();
}
}
滑動列表 觀察圖片加載情況铣减,onResourceReady打印了表示該位置圖片加載完成者铜。可得出結(jié)論:item不可見時線程及時回收了域仇。
因為我在項目中使用了BaseQuickAdapter類刑然,觀察發(fā)現(xiàn)快速滑動,之前的item還是會加載暇务。
為了解決這個問題泼掠,只得手動停止加載,代碼如下:
@Override
public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
if(holder.getAdapterPosition()!=-1){
Glide.clear(holder.itemView.findViewById(R.id.video_image));
}
}
值得注意的是般卑,我本來使用glide4.9.0時武鲁,無論有沒有使用baseQuickAdapter都沒辦法暫停線程。所以回退到了3.8.0
新版本真的要慎重檢驗再使用蝠检。