2011-11-08 9 views
4

私は本質的に私たちのウェブサイトで利用可能なデータを反映する新しいAndroidアプリケーションを作っています。 GUIには、各項目に画像とテキストの入ったListViewか、単一の項目の詳細を表示するRelativeLayoutが表示されます。ListAdapterまたはSimpleCursorAdapterからリストビューを取り込む

このアプリケーションの応答性を高めるために、データが最新であれば内部DBからデータを読み込み、内部データが古すぎる場合はサーバーのAPI(httpでJSON)からデータを読み込みたいと思います(そして内部DBに新しいデータを入力してください)。

基本的なチュートリアルから、内部DBからの読み込み時にDBとSimpleCursorAdapter(*)を使用する必要があるようです。しかし、ウェブから読むと、私はArrayListArrayAdapterを使っていると思います。

両方の状況に対応できるアダプタがありますか?

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

+1

なぜあなたがDBから検索Cursorに通知Uriを設定し実行するには

データが古すぎ、ウェブ上で新しいデータを入手してカーソルで使用すると、データベースを更新しませんか? – user370305

+0

ウェブから直接データを表示し、バックグラウンドでデータベースを更新したいと考えています。 –

+0

ウェブから直接データを表示するのではなく、最初にデータベースを更新し、そのデータをカーソルで表示することをお勧めしました。arraylistの使用を避け、データを表示してデータベースに保存することもできます。 – user370305

答えて

2

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

BaseAdapterを拡張したクラスでは、List<DataEntry>があります。ここで、DataEntryはJava POJOクラスで、Webまたはdbからのデータを表します(同じプロパティがあるものとします)。

)BaseAdapterを拡張するクラスのgetView()メソッドで、inflateでxmlレイアウトを使用します。基本的に1データ行を表します。 TextViewを使用してデータを表示すると仮定すると、1データ行のレイアウトには、DataEntryオブジェクトのデータフィールドの数と同じ数のTextView要素があります。

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

とそのあなたの後:あなたはあなたのレイアウトでUIを更新する過程で、あなたのようなリストビューを持っている必要があります)

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

2:インフレートした後、あなたは次のようにTextViewsに値を入れますList<DataEntry>は、すでにデータが移入されBaseAdapter

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

    YourClassExtendingBaseAdapter adapter = 
      new YourClassExtendingBaseAdapter(this, listOfEntryDataObjects); 

    listView.setAdapter(adapter); 

listOfEntryDataObjectsを拡張するクラスを初期化します。コンストラクタの '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 
} 
+0

私はあなたのアイデアを楽しんでいますが、DBAdapterとDBAdapterの両方の機能を含む方法でBaseAdapterを拡張する能力について少し気になりました。 –

+0

DBから来るデータとWebを "DataEntry "オブジェクト。その後、アダプタのみを使用してデータを表示します。 – hovanessyan

+0

大丈夫BaseAdapterを拡張するためのチュートリアルを探して、それを動作させることができれば答えを選びます...あなたの答えをありがとう! –

3

あなたはSimpleCursorAdapterAsyncTaskを使用することができます。しかしAndroid Compatibility Packageでは、Android 1.6でCursorLoader APIを使用することができます。 Loader APIを使用すると、Cursorsのライフサイクルの管理が容易になります。

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

各タスク(カーソルの読み込みとデータの更新)に2種類の異なるAsyncTasks(またはLoaders)を使用すると、db内のデータが変更された場合にListViewが自動的に更新されます。

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

そして、あなたがデータを更新した場合、そのUriの通知を送信します:

getContentResolver().notifyChange(Uri.parseString("mydata://someuri"), null); 
+0

この回答ありがとうございます。それはおそらく最も長期的な解決策ですが、締め切りの目的のために、私は今他の答えのようなものを実装しています。 –

関連する問題