Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

SimpleCursorAdapter

Класс SimpleCursorAdapter позволяет назначать данные курсора, используемые источником данных, для компонентов.

Существует две версии адаптера: android.support.v4.widget.SimpleCursorAdapter и android.SimpleCursorAdapter.

Схема работы адаптера представлена на рисунке.

SimpleCursorAdapter

В левой части представлен компонент на основе класса AdapterView, например, ListView, состоящих из отдельных элементов TextView. В правой части находятся данные, которые могут поступать из базы данных или контент-провайдера. Адаптер берёт по порядку первый элемент списка и первый ряд выбранного столбца из таблицы данных и привязывает их с идентификатором разметки отдельного элемента списка.

Класс SimpleCursorAdapter — это подкласс класса CursorAdapter, который был разработан для облегчения отображения столбцов класса Cursor непосредственно на компоненты TextView или ImagesView, определенные в XML-разметке.

Общий код для адаптера:


SimpleCursorAdapter adapter = new SimpleCursorAdapter(Context context,
        int layout,
        Cursor cursor,
        String[] fromColumns,
        int[] toViews,
        int flags)

Конструктор класса получает следующие параметры:

  • параметр Context, в котором выполняется компонент ListView или ему подобный
  • идентификатор ресурса разметки, который используется для отображения каждого элемента в ListView
  • класс Cursor, который обеспечивает доступ к данным, — этому аргументу можно присвоить значение null, если класс Cursor определяется позже
  • массив String, включающий отображаемые названия столбцов
  • массив типа int, включающий идентификаторы соответствующих ресурсов интерфейса
  • параметр типа int - флаг

Для создания класса SimpleCursorAdapter сначала определите массивы, включающие имена столбцов, для отображения на компоненты GUI. Также следует определить ID ресурсов для компонентов GUI, которые отображают данные из именованных столбцов. В коде создается массив String, показывающий, что может отображаться лишь именованный столбец. Затем создается параллельный массив типа int, содержащий ID ресурсов для соответствующих компонентов GUI. Потом создается класс SimpleCursorAdapter.

Размеры массивов fromColumns и toViews должные совпадать. К примеру, вы можете задать два столбца для извлечения данных и соответственно должны указать два идентификатора, например, для TextView для текста и ImagesView для картинки.

Имейте в виду, что один из конструкторов адаптера теперь устарел. Вы его можете иногда встречать в старых проектах, но копировать в свой проект его не стоит. Дело в том, что его работа происходит в одном потоке с интерфейсом программы и может серьёзно затормозить работу списка. Теперь рекомендуется использовать новый класс CursorLoader, который можно считать аналогом AsyncTask для адаптеров, использующий асинхронные операции. Второй конструктор имеет дополнительный параметр flags. Для быстрой переделки старого кода без использования CursorLoader вы можете просто добавить в код данный флаг CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER или SimpleCursorAdapter.FLAG_AUTO_REQUERY или просто использовать значение 0.

Если стандартный адаптер вас не устраивает, можно его переопределить. Кусок кода из одного проекта.


package ru.alexanderklimov.testapril2015;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.view.ViewGroup;


public class CustomSimpleCursorAdapter extends SimpleCursorAdapter {

    public CustomSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return super.newView(context, cursor, parent);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
        ViewHolder holder = (ViewHolder) view.getTag();
        if (holder == null) {
            holder = new ViewHolder();
            holder.colImp = cursor.getColumnIndexOrThrow(DbAdapter.COL_IMPORTANT);
            holder.listTab = view.findViewById(R.id.row);
            view.setTag(holder);
        }
    }

    static class ViewHolder {
        int colImp;
        View listTab;
    }
}

Примеры использования

Провайдер Browser

Intent.ACTION_SEND - Пришли фотку, письмо, сообщение

ASCII Art Editor

Контакт? Есть контакт!

Продвинутое приложение с использованием ListView

MediaStore

Список дел (устар.)

Реклама