2013-07-26 2 views
0

Мое приложение реализует ListView. Каждый элемент в списке отображает фотографию и текст. Оба они загружаются из Интернета. Я хотел бы предоставить свой собственный пользовательский класс для convertView, указанный в ListAdapter, чтобы я мог обновить его при загрузке изображения. Тем не менее, я не могу понять, совсем как обеспечить альтернативу Просмотреть (Я создал подкласс, который расширяет представление, но когда я изменил метод по умолчанию подписи наПредоставить настраиваемый класс для преобразования ListView

View getView(int position, View convertView, ViewGroup parent) 

в

View getView(int position, MyViewClass convertView, ViewGroup parent) 

Я получил компиляцию ошибка.

Как я могу поставить свой собственный класс для convertView?

ответ

0
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. Без аннотации у вас будет перегруженный метод, который не будет вызываться.

Смежные вопросы