Android Studio; Какой смысл надувать и сохранять представление в convertView?

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null){
    convertView = ContactViewActivity.this.getLayoutInflater().inflate(R.layout.contact_view_field_row,
    parent, false);
}

String value = (String)getItem(position);

TextView fieldValue = (TextView)convertView.findViewById(R.id.contact_view_row_value);
fieldValue.setText(value);

return convertView;
}

Приведенный выше код взят из класса BaseAdapter. Так какой смысл устанавливать раздутый вид для convertView? Весь смысл getView состоит в том, чтобы создать представление, если его нет, присвоить ему атрибуты, а затем вернуть его, чтобы его можно было показать в приложении в виде ListView, верно? Так почему бы просто не сказать findViewById(R.id.contact_view_row_value);? Я имею в виду, что мы действительно делаем с layoutInflater? Я думаю, что поскольку мы установили его равным convertView, нет необходимости вводить convertView.findViewById. Я имею в виду, что он уже равен завышенному XML-файлу, верно? Я здесь совсем запутался, я очень признателен за разъяснения.

1 ответ

Решение

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

Когда ваше приложение запускается, вам нужно inflate ваш Views для того, чтобы любые данные отображались в вашем ListView совсем. Inflate означает анализировать XML-код ресурса в графический объект и предоставлять его в Android. Contextтаким образом, это становится чем-то, что может быть визуализировано и взаимодействовать в графической иерархии. Позже в приложении Android пытается помочь вам сэкономить ресурсы и избежать ненужной инфляции, передавая вам View это было завышено ранее; вот почему мы проверяем, если convertView не равно null, Если это не так, вы можете конвертировать существующие View в то, что отображает данные, имеющие отношение к текущему индексу.

Однако стоит отметить, что ListView сейчас устарела. Попробуйте использовать RecyclerView вместо этого, где это поведение немного более очевидно. Вот пример.

Другие вопросы по тегам