Плавная прокрутка ListView в Android зависит от создания элементов
списка и установки атрибутов. Например, нужно создавать объекты сложной разметки или загружать изображения из интернета для каждого элемента. В этой
статье мы рассмотрим, как правильно создавать элементы для ListView в
getView()
методе, тем самым повышая эффективность визуализации и добиваясь плавной прокрутки.
Класс ViewHolder
Вначале нужно создать статический класс ViewHolder внутри класса, который реализует метод getView(). Чаще всего этот метод
реализует адаптер. В ViewHolder классе содержаться элементы разметки, а так же можно содержать позицию элемента, его идентификатор и так далее. Пример
ViewHolder класса:
public static final class ViewHolder {
CheckBox favorite;
TextView title;
TextView text;
TextView time;
}
Метод getView
Проблемы с прокруткой возникают в этом методе при частом создании объектов и поиске View в родительском элементе. Решением этой проблемы служит
повторное использование уже созданного View и ViewHolder класса. Следующий пример показывает, как решаются эти проблемы в
getView() методе адаптера:
// статический ViewHolder класс внутри адаптера
public static final class ViewHolder {
CheckBox favorite;
TextView title;
TextView text;
TextView time;
}
@Override
public View getView(LayoutInflater inflater, int position, View convertView) {
ViewHolder holder;
Item item = items.get(position);
// Сначала проверяется бы ли уже создан convertView
if (convertView == null) {
// Создаем View из файла разметки
convertView = inflater.inflate(R.layout.list_item, null);
// Создаем ViewHolder класс и ассоциируем элементы управления
holder = new ViewHolder();
holder.favorite = (CheckBox) convertView.findViewById(R.id.favorite);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.time = (TextView) convertView.findViewById(R.id.time);
// Сохраняем holder в элементе
convertView.setTag(holder);
} else {
// Объект convertView уже создан и
// метод findViewById не вызывается.
// Получаем holder из элемента
holder = (ViewHolder) convertView.getTag();
}
// заполняем атрибуты соответствующими значениями
holder.favorite.setChecked(item.is_favorite());
holder.title.setText(item.get_title());
holder.text.setText(item.get_text());
holder.time.setText(item.get_time());
return convertView;
}
}
Теперь нет постоянного создания элементов и вызова findViewById()
метода, и можно спокойно получить доступ к каждой View. Этим сохраняется процессорного время и, следовательно, увеличивается эффективность
визуализации списка.
Комментариев нет:
Отправить комментарий