首页 > 学院 > 开发设计 > 正文

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

2019-11-09 17:12:57
字体:
来源:转载
供稿:网友

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

解决方式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);}@Overridepublic int getItemCount() {return mData.size();}@Overridepublic void onViewRecycled(MyViewHolder holder) {super.onViewRecycled(holder);AsyncTask asyncTask = (AsyncTask) holder.imageView.getTag(1);asyncTask.cancel(true);}@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position) {//先设置图片占位符holder.imageView.setImageDrawable(mContext.getDrawable(R.mipmap.ic_launcher));AsyncTask asyncTask = new AsyncTask() {@Overrideprotected 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;}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);holder.imageView.setImageBitmap(bitmap);}};holder.imageView.setTag(1,asyncTask);asyncTask.execute();}@Overridepublic 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);}@Overridepublic int getItemCount() {return mData.size();}@Overridepublic void onViewRecycled(MyViewHolder holder) {super.onViewRecycled(holder);}@Overridepublic 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等待加载的图片urlholder.imageView.setTag(url);AsyncTask asyncTask = new AsyncTask() {@Overrideprotected 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;}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);//加载完毕后判断该imageView等待的图片url是不是加载完毕的这张//如果是则为imageView设置图片,否则说明imageView已经被重用到其他itemif(url.equals(holder.imageView.getTag())) {holder.imageView.setImageBitmap(bitmap);}}}.execute();}@Overridepublic 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,完美解决图片异步加载问题。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表