Вы CursorAdapter, CursorAdapter вписывается между Cursor (источник данных из запроса SQLite) и ListView (визуальное представление) и настраивает два аспекта:
Какой шаблон макета нужно накачать для элемента Какие поля полякурсор для привязки, к которому представления в шаблоне
просто создают шаблон макета XML в файле res / layout / item_todo.xml, представляющий конкретную строку курсора:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Study cursors"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvPriority"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="3"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
Далее нам нужноопределить адаптер, чтобы описать процесс проецирования данных курсора в представление.Для этого нам нужно переопределить метод newView и метод bindView.Наивный подход к этому (без кэширования любого вида) выглядит следующим образом:
public class TodoCursorAdapter extends CursorAdapter {
public TodoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
// The newView method is used to inflate a new view and return it,
// you don't bind any data to the view at this point.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_todo, parent, false);
}
// The bindView method is used to bind all data to a given view
// such as setting the text on a TextView.
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Find fields to populate in inflated template
TextView tvBody = (TextView) view.findViewById(R.id.tvBody);
TextView tvPriority = (TextView) view.findViewById(R.id.tvPriority);
// Extract properties from cursor
String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
int priority = cursor.getInt(cursor.getColumnIndexOrThrow("priority"));
// Populate fields with extracted properties
tvBody.setText(body);
tvPriority.setText(String.valueOf(priority));
}
}
Сначала мы определяем конструктор, который передает курсор и контекст суперклассу.Далее мы переопределяем метод newView, который используется для раздувания нового шаблона представления.Наконец, мы переопределяем метод bindView, который используется для привязки всех данных к данному представлению, чтобы заполнить содержимое шаблона для элемента.
Получение курсора Чтобы использовать CursorAdapter, нам нужно запросить SQLiteбазы данных и вернуть курсор, представляющий набор результатов.Это требует, чтобы мы использовали SQLiteOpenHelper для сохранения, как описано здесь, или ORM, который обеспечивает доступ к базовой базе данных.
Как только у вас есть база данных и определены таблицы, тогда мы можем получить доступ к Cursor, выполнив запрос к базе данныхс помощью rawQuery:
// TodoDatabaseHandler is a SQLiteOpenHelper class connecting to SQLite
TodoDatabaseHandler handler = new TodoDatabaseHandler(this);
// Get access to the underlying writeable database
SQLiteDatabase db = handler.getWritableDatabase();
// Query for items from the database and get a cursor back
Cursor todoCursor = db.rawQuery("SELECT * FROM todo_items", null);
Теперь мы можем использовать CursorAdapter в Activity для отображения массива элементов в ListView:
// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.lvItems);
// Setup cursor adapter using cursor from last step
TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor);
// Attach cursor adapter to the ListView
lvItems.setAdapter(todoAdapter);
Это затем вызовет CursorAdapter, выполняющий итерацию понабор результатов и заполнение списка.Мы можем изменить курсор для обновления адаптера в любое время:
// Switch to new cursor and update contents of ListView
todoAdapter.changeCursor(todoCursor);
Ссылочная ссылка