I would like to provide my own custom class for the convertView
Если вам нужен два или более видов видов для вашего адаптера ListView
, вам необходимо переопределить в своем адаптере getViewTypeCount()
и getItemViewType
. Первый метод возвращает количество видов просмотра, которое будет у вас, а второй тип возвращает тип просмотра, который должен иметь для текущей позиции позиции. Что-то вроде:
abstract class MyListAdapter implements ListAdapter {
/**
* Set this up in your constructor
* */
private Context context;
private static final int VIEW_TYPE_SUPERMAN = 1;
private static final int VIEW_TYPE_BATMAN = 2;
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public int getItemViewType(int position) {
if(position % 2 == 0) { // your business logic
return VIEW_TYPE_BATMAN;
}
return VIEW_TYPE_SUPERMAN;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
if(convertView == null) {
if(viewType == VIEW_TYPE_BATMAN) {
convertView = LayoutInflater.from(context).inflate(resource_id_for_batman, parent);
} else {
convertView = LayoutInflater.from(context).inflate(resource_id_for_superman, parent);
}
// setup a ViewHolder pattern implementation
} else {
// get your ViewHolder from convertView
}
// update your views from ViewHolder
return convertView;
}
}
Дополнительная информация: so that I can update it when an image has downloaded
. По этой причине вам не нужно иметь отдельный вид и тип. Вам нужно знать только для каждого элемента (в зависимости от его положения), если: изображение не было загружено, изображение не загрузилось, загрузка выполняется или изображение загружено. Поэтому я бы применил шаблон ViewHolder
, добавив эту информацию. Таким образом, у вас будет один тип вида, и для каждого случая вы решите, что делать (запускать загрузку, извлекать изображение из кэш-памяти или SD-карты или показывать изображение по умолчанию). Чтобы думать об этом лучше, я считаю, что вам нужно иметь отдельную структуру в реализации адаптера, но не в ViewHolder
, так как объект ViewHolder
будет привязан к переработанным представлениям.
Код, указанный выше (для добавления перегруженного View getView(int position, MyViewClass convertView, ViewGroup parent)
), должен компилироваться, если у вас нет аннотации @Override
. Без аннотации у вас будет перегруженный метод, который не будет вызываться.