Страница 1 из 19

Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 30 янв 2012, 07:16
damager82
В этом уроке:

- используем SimpleCursorAdapter для построения списка
- добавляем и удаляем записи в списке

[url=http://www.startandroid.ru/ru/uroki/vse ... l:3itzgxeb]Click here to read this article![/url:3itzgxeb]

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 03 фев 2012, 19:47
lics
Модифицировал данный пример т.о., что при кликаньи на иконку, производятся некие действия с записью, соответствующей элементу списка, на котором эта запись находится.

Код: Выделить всё

public void onButtonItemClick(View view) {
	    int id = cursor.getInt(cursor.getColumnIndex(DB.COLUMN_ID));
            //
            //  modify record
            //  
	    refreshCursor();
	    scAdapter.changeCursor(cursor);
	}
Проблема в том, что в данном обработчике, курсор указывает на запись, не соответствующую элементу списка, на котором кликнули. Получается, что на самом деле курсор ссылается на запись, находящуюся в начале или конце экрана. (Если вместо имиджа поставить кнопку эффект будет тот же) Если клацнуть сначала на саму запись (не на имидж),а потом на имидж, этого же элемента списка, то все в порядке, курсор соответствует элементу списка. Можно ли в данной ситуации, как-то добиться синхронизации между курсором и списком, при клике на кнопке и обойтись без двойного нажатия ?

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 07 фев 2012, 12:53
damager82
А как вы повесили обработчик на картинку?

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 07 фев 2012, 13:51
lics
В xml, в секции <ImageView>, по аналогии с кнопкой "добавить запись"

Код: Выделить всё

<?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="wrap_content"
	 android:orientation="horizontal">
	<ImageView
		android:id="@+id/ivImg"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
	 	android:onClick="onButtonItemClick"
		android:src="@drawable/folder">
	</ImageView>
	<TextView
		android:id="@+id/tvName"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_gravity="center_vertical"
		android:layout_marginLeft="10dp"
		android:text=""
		android:onClick="onGroupClick"
		android:textSize="14sp">
	</TextView>
</LinearLayout>

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 09 фев 2012, 12:15
lics
Уже разобрался, синхронизации между списком и курсором удалось достичь, добавив в обработчик нажатия код:

Код: Выделить всё

  public void onButtonItemClick(View v) {
	  int pos = lvData.getPositionForView(v);
	  cursor.moveToPosition(pos);
          .................................
  }

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 09 фев 2012, 13:30
lics
Вопрос по оптимальности
Допустим, что основная часть приложения получает по некому условию выборку из базы данных (до 600 записей) и выводит интерфейс для корректировки этих данных в виде таблицы.
С точки зрения простоты кода, вроде как, проще использовать SimpleCursorAdapter и держать постоянно активным курсор и соединение с SQlite, т.к. все время читаем и пишем.
Насколько такой подход оптимален с точки зрения использования ресурсов ?
Другой вариант, прочитать нужное из базы загрузить в массив, закрыть курсор и работать, через например CustomAdapter, обновляя массив и прописывая изменения в базу по мере обновления, кажется более громоздким. Стоит ли это все городить, только из за отсутствия постоянно открытого курсора ?

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 11 фев 2012, 22:09
damager82
Хороший вопрос ...
Мне хочется верить, что Cursor заточен под такие задачи и ест не сильно больше памяти, чем массив или коллекция тех же данных.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 13 мар 2012, 15:18
яфпкк
не знаю в какой теме задать вопрос, задам здесь.

Хочу вернуть из query определенный набор полей
Cursor cur = db.query("table1",new String[]{"name1,name2"},null.nulll,...);

При попытке передать этот курсор в SimpleCursorAdapter получаю ошибку "IllegalArgumentException: column '_id' does not exist"

в мане про CursorAdapter прочитал
Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.

т.е. я прально понимаю, если я собираюсь передавать курсор в SimpleCursorAdapter, то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 14 мар 2012, 15:23
KamiSempai
яфпкк писал(а):...если я собираюсь передавать курсор в SimpleCursorAdapter, то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???
Да. Наличие столбца "_id", в данном случае, обязательно.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 26 мар 2012, 09:27
damager82
яфпкк писал(а):то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???
Да, причину я описал в уроке 38:
В различных источниках при работе с БД в качестве наименования поля-идентификатора в таблице используют не просто id, а _id. Почему?

Ответ нашелся в доках по Cursor-адаптерам. Цитата: "The Cursor must include a column named "_id" or this class will not work.". Т.е. если вы планируете использовать Cursor-адаптеры, то необходимо, чтобы таблица содержала поле _id, иначе адаптер не будет работать.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 08 апр 2012, 14:08
irukanji
такой вопрос- вы в своих уроках используете некоторые методы которые в Android считаются deprecated типа startManagingCursor() stopManagingCursor() и другие... Критично ли это для меня как новичка? И как заменить их на предпочтительные методы? Спасибо.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 08 апр 2012, 20:46
KamiSempai
irukanji писал(а):Критично ли это для меня как новичка? И как заменить их на предпочтительные методы? Спасибо.
Лично я, для себя, отметил одно, если Эклипс не просит пометить метод как "deprecated", значит можно его использовать. Большинство предложений Гугла по замене "deprecated" методов применимо только к более высокой версии SDK. Следовательно, что является "deprecated" для Android 4.0, для Android 2.1 таковым может не являться. Все зависит от того на какую платформу Вы пишите приложение.
Конечно, чем выше версия Android тем больше возможностей появляется, но не стоит забывать, что при этом меньше людей смогут установить ваше приложение.

PS: Я тут про это уже спрашивал, но мне никто толком не ответил. Пришлось делать выводы самому. Надеюсь я не слишком заблуждаюсь.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 09 апр 2012, 09:56
damager82
KamiSempai писал(а):Надеюсь я не слишком заблуждаюсь.
Я примерно также вижу ситуацию. Если хотите использовать то, что Android предлагает вместо deprecated методов, то можно подключить support packages и юзать новые возможности. Для этого надо залить их через SDK-manager и добавить в проект. Тут мануалка: http://developer.android.com/sdk/compat ... brary.html

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 09 апр 2012, 12:08
KamiSempai
damager82 писал(а):Тут мануалка: http://developer.android.com/sdk/compat ... brary.html
Спасибо, нужно будет почитать, как нибудь.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 31 май 2012, 15:55
Grigory
как вытащить нужную строку из базы зная номер id ?

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 31 май 2012, 17:21
damager82
Grigory писал(а):как вытащить нужную строку из базы зная номер id ?
Метод query, урок 36.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 05 июн 2012, 07:09
inomqvo9
Спасибо за познавательный урок!
Не подскажете, каким образом можно менять цвет или размер текста в зависимости от значений из БД?

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 05 июн 2012, 13:59
gaydamaka
Здравствуйте, у меня выдает ошибку на создание адаптера, не подскажите что это может быть

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 06 июн 2012, 09:25
damager82
inomqvo9 писал(а):Спасибо за познавательный урок!
Не подскажете, каким образом можно менять цвет или размер текста в зависимости от значений из БД?
Есть пара способов. В уроках 49 и 50 я об этом рассказывал.

Re: Урок 52. SimpleCursorAdapter, пример использования

Добавлено: 06 июн 2012, 09:26
damager82
gaydamaka писал(а):Здравствуйте, у меня выдает ошибку на создание адаптера, не подскажите что это может быть
А что конкретно пишет?