RecyclerView中,图片加载重用问题,异步加载图片

额,首先要感谢这位兄台,然后我就直接上代码吧


解决方式1 demo代码:
public class MyRecyclerAdapter extends RecyclerView.Adapter {
private static final String TAG = "MyRecyclerAdapter";

private List mData;
private Context mContext;
private LayoutInflater inflater;

public MyRecyclerAdapter(Context context, List data) {
this.mContext = context;
this.mData = data;
inflater = LayoutInflater.from(mContext);
}

@Override
public int getItemCount() {
return mData.size();
}

@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
AsyncTask asyncTask = (AsyncTask) holder.imageView.getTag(1);
asyncTask.cancel(true);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
//先设置图片占位符
holder.imageView.setImageDrawable(mContext.getDrawable(R.mipmap.ic_launcher));
AsyncTask asyncTask = new AsyncTask() {
@Override
protected Bitmap doInBackground(Void... params) {
try {
URL url = new URL(mData.get(position));
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
holder.imageView.setImageBitmap(bitmap);
}
};
holder.imageView.setTag(1,asyncTask);
asyncTask.execute();
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}

static class MyViewHolder extends RecyclerView.ViewHolder {

ImageView imageView;

public MyViewHolder(View view) {
super(view);
imageView = (ImageView) view.findViewById(R.id.id_img);
}

}
}

或者这样写:

解决方式2 demo代码:
public class MyRecyclerAdapter extends RecyclerView.Adapter {
private static final String TAG = "MyRecyclerAdapter";

private List mData;
private Context mContext;
private LayoutInflater inflater;

public MyRecyclerAdapter(Context context, List data) {
this.mContext = context;
this.mData = data;
inflater = LayoutInflater.from(mContext);
}

@Override
public int getItemCount() {
return mData.size();
}

@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
//先设置图片占位符
holder.imageView.setImageDrawable(mContext.getDrawable(R.mipmap.ic_launcher));
final String url = mData.get(position);
//为imageView设置Tag,内容是该imageView等待加载的图片url
holder.imageView.setTag(url);
AsyncTask asyncTask = new AsyncTask() {
@Override
protected Bitmap doInBackground(Void... params) {
try {
URL url = new URL(mData.get(position));
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//加载完毕后判断该imageView等待的图片url是不是加载完毕的这张
//如果是则为imageView设置图片,否则说明imageView已经被重用到其他item
if(url.equals(holder.imageView.getTag())) {
holder.imageView.setImageBitmap(bitmap);
}
}
}.execute();
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}

static class MyViewHolder extends RecyclerView.ViewHolder {

ImageView imageView;

public MyViewHolder(View view) {
super(view);
imageView = (ImageView) view.findViewById(R.id.id_img);
}

}
}


ok,完美解决图片异步加载问题。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值