Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс SimpleCursorAdapter позволяет назначать данные курсора, используемые источником данных, для компонентов.
Существует две версии адаптера: android.support.v4.widget.SimpleCursorAdapter и android.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)
Конструктор класса получает следующие параметры:
Для создания класса 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;
}
}
Intent.ACTION_SEND - Пришли фотку, письмо, сообщение
Продвинутое приложение с использованием ListView