4

私は、基本的に私たちのウェブサイトで利用可能なデータをミラーリングする新しい Android アプリを作成しています。GUI にはListView、各項目に画像とテキストを含む 、またはRelativeLayout1 つの項目の詳細を表示する が表示されます。

このアプリの応答性を高めるために、データが十分に新しい場合は内部 DB からデータを読み取り、内部データが古すぎる場合はサーバーの API (JSON over http) からデータを読み取ります (そして、新しいデータを含む内部 DB)。

基本的なチュートリアルから、内部 DB から読み取る場合は DB とSimpleCursorAdapter(*) を使用する必要があるようです。ArrayListしかし、ウェブから読むときは、 andを使用していると思いますArrayAdapter

両方の状況を処理できるアダプターのタイプはありますか?

(*) CursorLoader で LoaderManager を使用することが最新の方法であることはわかっていますが、Android 2.1 をサポートしようとしています。SimpleCursorAdapter を AsyncTask に入れて ANR を回避できると思います。

4

2 に答える 2

3

もちろん、SimpleCursorAdapterとを使用できますAsyncTask。しかし、Android 互換パッケージCursorLoaderを使用すると、Android 1.6 で API を使い始めることができます。Loader API を使用すると、 のライフサイクルを簡単に管理できますCursors

API を使用してまたは データベースからCursorLoaderを取得することをお勧めします。そして、(または AsyncLoader のカスタム実装) を使用して、サーバーからデータを取得し、更新します。 CursorContentProviderAsyncTaskContentProvider

各タスク(カーソルのロードとデータの更新)に2つの異なるAsyncTasks(またはLoaders)を使用するListViewと、データベース内のデータが変更された場合に自動的に更新を行うことができます。

これを行うには、データベースから取得した通知Uriを設定Cursorします。

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

データを更新した場合は、その通知を送信しますUri

getContentResolver().notifyChange(Uri.parseString("mydata://someuri"), null);
于 2011-11-08T11:13:29.920 に答える
2

BaseAdapter クラスを拡張してカスタム アダプタを作成し、両方のケースで使用できると思います。

BaseAdapter を拡張するクラスにはList<DataEntry>、DataEntry が Java POJO クラスであり、web または db からのデータを表す があります (同じプロパティがあると仮定します)。に DataEntry オブジェクトを設定し、既にデータが含まれていると仮定するとList<DataEntry>、次のように実行できます。

1) BaseAdapter を拡張するクラスの getView() メソッドでは、インフレートで、基本的に 1 つのデータ行を表す xml レイアウトを使用します。TextView を介してデータを表示すると仮定すると、1 データ行レイアウトには、DataEntry オブジェクトのデータ フィールドの数と同じ数の TextView 要素が含まれます。インフレートした後、次のように TextViews に値を入れます。

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

2) レイアウトの UI を更新するプロセスでは、次のような 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 
} 
于 2011-11-08T10:46:16.827 に答える