Android Custom Listview - PullRequest
       6

Android Custom Listview

4 голосов
/ 12 августа 2011

Я просмотрел уроки и искал, но все еще не могу понять, как,

getView(int position, View convertView, ViewGroup arg2)

метод работает, когда расширяет BaseAdapter, чтобы создать собственный список в моем приложении для Android. Поэтому я не могу редактировать пользовательский список в точности так, как я хочу.

Мне нужно знать, когда этот метод вызывает и значения параметров.

Если кто-то может объяснить следующий метод, это здорово. Спасибо

@Override
public View getView(int position, View convertView, ViewGroup arg2)
{

    ViewHolder holder;
    LayoutInflater inflater =  context.getLayoutInflater();

    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.listitem_row, null);                     
        holder = new ViewHolder();
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.textView2);

        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();                                        
    }

    holder.txtViewTitle.setText(title[position]);
    holder.txtViewDescription.setText(description[position]);



  return convertView;
}

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

getView() вызывается при вызове setAdapter в вашем коде. После этого, когда вы перемещаете фокус по списку или выбираете любой элемент, или вы звоните notifyDataSetChanged(), вы получаете звонок в getView().

Position - Позиция элемента в наборе данных адаптера элемента, вид которого мы хотим.

convertView - старый вид для повторного использования, если это возможно. Примечание. Перед использованием убедитесь, что это представление не пустое и имеет соответствующий тип. Если невозможно преобразовать это представление для отображения правильных данных, этот метод может создать новое представление. Гетерогенные списки могут указывать количество типов представлений, так что это представление всегда имеет правильный тип

ViewGroup - к которому в конечном итоге будет привязано это представление.

3 голосов
/ 12 августа 2011

getView () : Как указано в спецификации, метод getView отображает данные в указанной позиции.Таким образом, когда вы устанавливаете Adapter и когда вы прокручиваете, будет вызываться ваш метод getView listView.

Метод, который вы скопировали здесь, является частью EfficientAdapter для оптимизации производительности вашего ListView, и наряду с оптимизацией вы использовали ViewHolder шаблон.

Скопировано изСпецификации: С небольшим дополнительным объяснением

position : Положение элемента в наборе данных адаптера элемента, вид которого мы хотим.

convertView : Старый вид для повторного использования, если это возможно.Примечание. Перед использованием убедитесь, что это представление не пустое и имеет соответствующий тип.Если невозможно преобразовать это представление для отображения правильных данных, этот метод может создать новое представление.Гетерогенные списки могут указывать количество типов представлений, так что это представление всегда имеет правильный тип (см. GetViewTypeCount () и getItemViewType (int)).

Итак, в приведенном выше методе, когда вы делаете следующую вещьВы повторно используете свой convertView.

     if (convertView == null){
            ....
            convertView.setTag(holder);
     } else {
           holder = (ViewHolder) convertView.getTag(); 
      }

И, выполняя следующее, вы избегаете поиска (findViewById), что является хорошим преимуществом шаблона ViewHolder

      holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);

parent : родитель, к которому в конечном итоге будет присоединено это представление

Отредактировано

Вопрос: Сколько раз getViewназывается и сколько convertView будет создано?Ответ: Давайте рассмотрим пример Efficeint Adapter от ApiDemos .Если на экране отображается 10 строк, то

convertView Count : 10 + 1 = 11 (10 строк на экране, одна дополнительная для отображения эффекта прокрутки).Это означает, что операторы в блоке if (convertView == null) {...} будут вызываться только 11 раз.

getView Count : Первоначально count будет равен 10, но при запуске прокруткирассчитывать продолжают расти.getView вызывается каждый раз для обновления данных.

Примечание. Это верно только для метода getView, упомянутого в вопросе.

2 голосов
/ 12 августа 2011

Вот описание getView() параметров:

int position - позиция просмотра в списке;

View convertView - ИМХО, это самый сложный параметр дляпонимание.В начале работы со списком convertView = null.Но когда вы начинаете прокручивать его вниз, когда элемент списка (который является экземпляром View) скрыт, он сохраняется в памяти, как convertView.Этот трюк позволяет вам не создавать новый элемент при прокрутке списка назад , а использовать convertView, сохраненный в памяти.Таким образом, первым элементом списка, который становится convertView, является элемент в позиции 0.Помните, что когда вы прокручиваете ListView вниз (от 0 позиции к большему), convertView располагается сверху и снизу, если вы прокручиваете ListView вверх.

ViewGroup arg2 - это вашListView (этот класс является производным от ViewGroup).

ViewHolder - это шаблон, который обеспечивает удобную связь с элементами списка.Вы делаете этот объект тегом элемента и можете использовать его для косвенного взаимодействия с элементом списка, потому что он ссылается на поля элемента (View.setTag(holder)).

getView () вызывается каждый раз, когда Android нужно рисоватьеще один элемент списка.

Есть вопросы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...