Android ListView и плавная прокрутка списков

Android ListView и плавная прокрутка списков

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

Комментариев нет:

Отправить комментарий