Я пытаюсь использовать библиотеку Picasso для загрузки внешних изображений в строки в ListView
. У меня есть пользовательский ArrayAdapter
следующим образом:
public class RevisedBusinessesAdapter extends ArrayAdapter<HashMap<String, String>> {
Context context;
int layoutResourceId;
ArrayList<HashMap<String, String>> data = null;
public RevisedBusinessesAdapter(Context context, int layoutResourceId, ArrayList<HashMap<String, String>> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
RevisedBusinessHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new RevisedBusinessHolder();
holder.ivLogo = (ImageView) row.findViewById(R.id.ivBusinessLogo);
row.setTag(holder);
} else {
holder = (RevisedBusinessHolder) row.getTag();
}
HashMap<String, String> business = data.get(position);
String strLogoURL = business.get("logoURL");
if (null != strLogoURL && !"".equals(strLogoURL)) {
Picasso.with(this.context).load(strLogoURL).into(holder.ivLogo);
}
return row;
}
static class RevisedBusinessHolder {
ImageView ivLogo;
}
}
где logoURL - это URL-адрес удаленного изображения; если не указано, ivBusinessLogo
имеет локальный набор src, и это показано вместо этого. Когда я быстро прокручиваю, Picasso загружает изображение в неправильное ImageView
, и я заканчиваю его несколькими копиями в списке.
Ответ на этот предполагает добавить
Picasso.with(context).cancelRequest(holder.ivLogo);
до существующего вызова Пикассо, но это не имеет никакого значения. Если я удалю проверку row == null
и всегда создаю новое представление, оно работает нормально. В полной версии этого, однако, есть также четыре текстовых изображения и пять других изображений (маленькие значки, загруженные из локальных ресурсов, а не через Picasso), которые необходимо обновлять в каждом getView
.
Есть ли способ сделать эту работу с шаблоном View Holder Документация по Android рекомендует?