2016-02-12 2 views
0

Я прошу об этом, потому что все работает хорошо, но я не понимаю, почему это реализовано таким образом.Как это работает, используя аргумент convertView, предоставляемый getView от ArrayAdapter?

Я прочитал, как использовать convertView здесь:

What is the purpose of `convertView` in ListView adapter?

Но потом я прочитал этот код: (ссылка: https://github.com/paraches/ListViewCellDeleteAnimation)

  • ViewHolder - тег для просмотра информации об в объект

deleteCell функция, мы установите needInflate boolean (ViewHolder) в true, поэтому мы предоставляем информацию, которую этот взгляд можно использовать повторно. Когда мы создаем новый параметр мы view тега в ложь ...

Почему во втором if заявления, скажем needInflate, чтобы быть правдой (что view открыт для повторного использования), в фигурных скобках, мы находимся в новом view? Не должно было быть наоборот, второе - третье (view = convertView;) и наоборот? getView функция:

@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ... 

      if (convertView==null) { 
       view = mInflater.inflate(R.layout.chain_cell, parent, false); 
       setViewHolder(view); 
      } 
      else if (((ViewHolder)convertView.getTag()).needInflate) { 
       view = mInflater.inflate(R.layout.chain_cell, parent, false); 
       setViewHolder(view); 
      } 
      else { 
       view = convertView; 
      } 

     vh = (ViewHolder) view.getTag(); 
     vh.text.setText(cell.name); 

      vh.imageButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         deleteCell(view, position); 
      } 
     }); 

     return view; 
    } 

EDIT Когда я делаю то, что я объясню выше изменения второго и третьего утверждения, то создает некоторое дополнение или несколько запас, я не знаю ...

ответ

0

ListViews может быть большой. Кроме того, обычно элемент listview только меняет свое содержание друг от друга. т. Е. Каждая запись в виде списка обычно имеет одинаковые элементы интерфейса. Рассмотрим следующее изображение как ссылку.

example listview

Как вы можете видеть, каждая клетка имеет

  1. An ImageView
  2. Заголовок TextView (Берлин)
  3. Подзаголовок TextView (Snowing)
  4. Температура TextView (0)
  5. Arrow ImageView

Из одной ячейки в другую меняются только значения ячейки. Более того, сразу нам не нужно отображать все ячейки. Нам нужно отображать все, что должно быть видимым на экране в данный момент времени.

Создание представления занимает некоторое время. Когда вы добавляете, есть большой список предметов (скажем, 100 предметов), и вы пытаетесь создать их все сразу, вы начнете замечать безответственность приложения.

Учитывая все эти факторы, мы используем метод «Повторное использование». То, что мы просто делаем, точно так же, как следует из названия. Мы просто повторно используем существующие объекты вида. Мы можем изменить только отображаемые значения и не создавать новые представления, если мы можем повторно использовать существующее представление.

Как вы знаете, метод getView адаптера вызывается при рисовании списка.Как вы знаете, метод getView listView вызывается, когда вы прокручиваете список вниз в дополнение к времени создания.

Итак, предположим, что вы прокрутите вниз по виду. Когда вы прокручиваете вниз, первая ячейка (Берлин) исчезает с точки зрения. Теперь он готов к повторному использованию.

Итак, всякий раз, когда вы получаете такую ​​многоразовую ячейку, ОС Android вызывается методом getView и передает это многоразовое представление как параметр «convertView». Итак, если вы в основном получаете ненулевой «convertView», это означает, что вам не нужно раздувать представление, и вы можете использовать и существующее представление.

+0

Я мужчина, вы все в порядке, хорошая почта и объяснение. Я прочитал это в ссылке, о которой идет речь ... Но мой вопрос был так, как будто вы сказали, что нам нужно повторно использовать аргумент «convertView», поэтому почему во втором случае if мы раздуваем новый вид? – Jeste

+0

Ahh. Хорошая точка @ Жест. Это потому, что во-первых, нет повторного использования. т.е.: при загрузке списка сначала нет никаких видов, которые можно повторно использовать. Поэтому вы должны инициировать его в первый раз. Поэтому при первой загрузке listView вы увидите, что convertView равен NULL. С этого момента (теоретически) вы должны уметь видеть, что convertView не будет NULL. Однако мы не можем предсказать, что он НЕ будет NULL * always * впоследствии. Это зависит от того, как ведет себя ОС Android. Почему бы вам просто не поставить журнал, чтобы посмотреть, как ведет себя параметр conversionView! –

+0

Можете ли вы посоветовать мне, что положить в журнал? BTW есть только один класс - активность не большая в проекте, если у вас есть время, попробуйте ... – Jeste

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