額,首先要感謝這位兄臺,然后我就直接上代碼吧
解決方式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,完美解決圖片異步加載問題。
新聞熱點
疑難解答