заполнить представление списка из ListAdapter или SimpleCursorAdapter - PullRequest
4 голосов
/ 08 ноября 2011

Я создаю новое приложение для Android, которое по существу отражает данные, доступные на нашем сайте. В графическом интерфейсе будет отображаться либо ListView с изображениями и текстом в каждом элементе, либо RelativeLayout, в котором будут отображаться сведения об одном элементе.

Чтобы повысить скорость отклика в этом приложении, я хотел бы прочитать данные из внутренней БД, если данные достаточно свежие, и прочитать данные из API сервера (JSON через http), если внутренние данные слишком старые ( а затем заполните внутреннюю базу данных новыми данными).

Из базовых уроков, похоже, следует использовать БД и SimpleCursorAdapter (*) при чтении из внутренней БД. Но при чтении из Интернета, я думаю, я бы использовал ArrayList и ArrayAdapter.

Есть ли какой-то тип адаптера, который может справиться с обеими ситуациями?

(*) Я знаю, что самое последнее - это использовать LoaderManager с CursorLoader, но я пытаюсь поддерживать Android 2.1. Я полагаю, что могу поместить SimpleCursorAdapter в AsyncTask и избежать ANR.

Ответы [ 2 ]

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

Конечно, вы можете использовать SimpleCursorAdapter и AsyncTask. Но с помощью пакета обеспечения совместимости Android вы можете начать использовать CursorLoader API с Android 1.6. Loader API упрощает управление жизненным циклом Cursors.

Я бы предложил использовать CursorLoader API для извлечения Cursor из ContentProvider или базы данных. И используйте AsyncTask (или пользовательскую реализацию AsyncLoader) для получения данных с сервера и обновления ContentProvider.

Если вы используете два разных AsyncTasks (или Loaders) для каждой задачи (загрузка курсора и обновление данных), вы можете автоматически настроить ListView, если данные в БД изменились.

Для этого установите уведомление Uri на Cursor, которое вы получили из базы данных:

cursor.setNotificationUri(getContentResplver(), Uri.parseString("mydata://someuri"));

А если вы обновили данные, отправьте уведомление для этого Uri:

getContentResolver().notifyChange(Uri.parseString("mydata://someuri"), null);
2 голосов
/ 08 ноября 2011

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

В вашем классе, который расширяет BaseAdapter, у вас будет List<DataEntry>, где DataEntry - это Java POJO класспредставляет данные, поступающие из сети или базы данных (при условии, что они имеют те же свойства).Предполагая, что вы заполнили List<DataEntry> объектами DataEntry, уже содержащими данные, вы можете сделать следующее:

1) В методе getView () класса, который расширяет BaseAdapter, в inflate вы будете использоватьXML-макет, который в основном представляет 1 строку данных.Предполагая, что вы будете отображать данные через TextView, макет строки данных 1 будет иметь столько же элементов TextView, сколько и число полей данных вашего объекта DataEntry.После раздувания вы помещаете значения в TextViews как:

    TextView someTextViewToDisplayField = (TextView) convertView.findViewById(R.id.yourID);
    someTextViewToDisplayField.setText(String.valueOf(dataEntry.getWhateverProperty()));

2) в процессе, где вы обновляете пользовательский интерфейс в вашем макете, вы должны иметь ListView как:

    <ListView android:id="@+id/YourListViewID" android:layout_width="fill_parent"
    android:layout_height="wrap_content"></ListView>

и после этого вы инициализируете свой класс, который расширяет BaseAdapter

   ListView listView = (ListView) findViewById(R.id.YourListViewID); 

   YourClassExtendingBaseAdapter adapter = 
            new YourClassExtendingBaseAdapter(this, listOfEntryDataObjects);

    listView.setAdapter(adapter);   

. listOfEntryDataObjects List<DataEntry> уже заполнен данными.'This' в конструкторе - это контекст, связанный с текущей операцией, из которой вы выполняете вызов.

Структура класса, расширяющая BaseAdapter:

public class YourClassExtendingBaseAdapter extends BaseAdapter { 

    private Context context;
    private List<DataEntry> entries;

public YourClassExtendingBaseAdapter(Context context,
        List<DataEntry> entries) {
    this.context = context;
    this.entries = entries;
}
  // Overwriting necessary methods 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...