Плавная прокрутка 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
. Этим сохраняется процессорного время и, следовательно, увеличивается эффективность
визуализации списка.
Комментариев нет:
Отправить комментарий