Android SimpleCursorAdapter против LoaderManager / CursorLoader - PullRequest
1 голос
/ 16 июня 2011

Как я могу расширить SimpleCursorAdapter, чтобы учесть следующее:

2 фрагмента, одно меню и одна деталь.Меню ListFragment представляет собой список таблиц, подробно ListFragment показывает результат запроса по этим таблицам.Деталь ListFragment получает имя таблицы из выбора в меню ListFragment.В onActivityCreated внутри детального ListFragment все записи выделены в курсор.Этот курсор передается в SimpleCursorAdapter.Этот SimpleCursorAdapter затем устанавливается как ListAdapter для подробного ListFragment.

Что я не могу понять, так это как динамически изменять SimpleCursorAdapter для отображения правильного количества столбцов на основе результатов курсора.У меня есть имена столбцов из Cursor.getColumnNames (), и я могу выбросить их в параметр String [] из конструктора SimpleCursorAdapter.Но как мне динамически создавать представления, необходимые для параметра int to?Будет ли SimpleCursorAdapter просто не работать в этой ситуации, так как он ищет идентификаторы, созданные из файла макета XML?Должен ли я перейти к использованию LoaderManager с CursorLoader?Это будет более гибкое решение?

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Вы должны перейти на использование LoaderManager с CursorLoader.

Как SimpleCursorAdapter говорит частично:

Этот конструктор устарел. Этот параметр не рекомендуется, так как он приводит к тому, что запросы курсора выполняются в потоке пользовательского интерфейса приложения, что может привести к плохой отзывчивости или даже к ошибкам приложения не отвечает.

0 голосов
/ 30 июня 2012

Использование LoaderManager / CursorLoader не решит вашу проблему с заполнением SimpleCursorAdapter. Но вам, безусловно, следует использовать его, чтобы заполнить свой список из потока пользовательского интерфейса и эффективно обрабатывать изменения конфигурации ваших действий.

Вот как сопоставить имена столбцов Cursor с TextViews для каждой строки:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), 
     R.layout.custom_row,
     null, 
     new String[] { "columnName_1", "columnName_2", "columnName_3" }, 
     new int[] { R.id.txtCol1, R.id.txtCol2, R.id.txtCol3 }, 0);
setListAdapter(adapter);

Это сопоставит 3 столбца в вашем курсоре с 3 TextViews в вашем файле макета

Так что ваш res / layout / custom_row.xml может выглядеть так:

<LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
     <TextView android:id="@+id/txtCol1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 1 text will end up here!" />

     <TextView android:id="@+id/txtCol2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 2 text will end up here!" />

     <TextView android:id="@+id/txtCol3"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 3 text will end up here!" />
</LinearLayout>

В реальном мире вы можете найти лучшие результаты с помощью TableLayout.

Для CursorLoader взгляните на http://developer.android.com/guide/components/loaders.html Они представляют собой отличный пример использования CursorLoader и LoaderManager для CursorAdapters, что вам и нужно сделать.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...