#java #android #adapter #ion
#java #Android #адаптер #android-ion
Вопрос:
Я сталкиваюсь с проблемой, когда хочу загружать изображения из адаптера, используя библиотеку ion.
На самом деле, у меня есть элементы со строкой, соответствующей URL-адресу иконического изображения, которое я хочу загрузить для каждого элемента в моем gridview.
Проблема связана с управлением представлением адаптера (повторное использование существующего представления, если я не ошибаюсь), и я не знаю, как это обойти…
Например, если я загружаю 10 элементов с изображением, в первый раз это работает. Затем, когда я прокручиваю вниз, а затем прокручиваю вверх, изображение изменяется (из-за повторного использования существующего представления …)
Можете ли вы мне помочь?
Это мой код адаптера :
public class ProtocoleAdapter extends BaseAdapter {
private Context context;
private List<ProtocoleItem> mListe;
public ProtocoleAdapter(Context context, List<ProtocoleItem> liste) {
this.context = context;
this.mListe = liste;
}
private class ViewHolder {
TextView txtTitre;
ImageView img;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater
.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.txtTitre = (TextView) convertView
.findViewById(R.id.grid_item_label);
holder.img = (ImageView) convertView
.findViewById(R.id.grid_item_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final ProtocoleItem rowItem = mListe.get(position);
boolean isLoaded = false;
try {
Bitmap bitmap = Ion.with(context)
.load(rowItem.getImage())
.asBitmap()
.get();
isLoaded = true;
holder.img.setImageBitmap(bitmap);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if (!isLoaded) {
if (position % 5 == 0) {
holder.img.setBackgroundColor(0xff176799);
} else {
if (position % 4 == 0) {
holder.img.setBackgroundColor(0xff2F87B0);
} else {
if (position % 3 == 0) {
holder.img.setBackgroundColor(0xff42A4BB);
} else {
if (position % 2 == 0) {
holder.img.setBackgroundColor(0xff5BC0C4);
} else {
holder.img.setBackgroundColor(0xff78D6C7);
}
}
}
}
}
holder.txtTitre.setText(rowItem.getTitre());
return convertView;
}
Спасибо за все!
Хорошего дня
Ответ №1:
Получите последнюю версию Ion и используйте следующее.
Ion.with(holder.img)
.load(rowItem.getImage());
Этот метод будет загружаться асинхронно.
Ваше текущее использование блокирует поток пользовательского интерфейса. Ion должен правильно обрабатывать переработку convertView, так что это не проблема.
Ответ №2:
Это проблема с отложенной загрузкой, используйте универсальный загрузчик изображений: https://github.com/nostra13/Android-Universal-Image-Loader
https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/sample/src/com/nostra13/example/universalimageloader/ImagePagerActivity.java
Комментарии:
1. Теперь, как это сделать с помощью библиотеки ion?
2. Я не знаю о библиотеке Ion, проблема, на которую вы ссылались, — это отложенная загрузка, и universal image loader — лучшее решение для нее.
3. На самом деле это не объективный ответ, но спасибо, я попробую это
4. Может ли кто-нибудь быть более понятным? Я не понимаю, почему отложенная загрузка убивает мой ListView ImageView x_x ‘
5. Это отлично работает с ion. Асинхронные отложенные загрузки были частью ion с версии v1. Он просто выполнял блокирующий вызов с помощью .get() .