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);
- }@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);}}}
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: