2011-11-08 147 views
4

我正在製作一個新的Android應用程序,它基本上反映了我們網站上可用的數據。 GUI將顯示每個項目中帶有圖像和文本的ListView或顯示單個項目的詳細信息的RelativeLayout從ListAdapter或SimpleCursorAdapter填充列表視圖

爲了提高這個應用程序的響應速度,我想從內部數據庫讀取數據,如果數據足夠新,並且從服務器API(通過http的JSON)讀取數據(如果內部數據太舊(然後用新數據填充內部數據庫)。

從基本教程中,似乎應該從內部數據庫讀取時使用DB和SimpleCursorAdapter(*)。但是當從網上閱讀時,我想我會使用ArrayListArrayAdapter

是否有某種類型的適配器可以處理這兩種情況? (*)我知道最新的事情是使用LoaderManager與CursorLoader,但我試圖支持Android 2.1。我想我可以將SimpleCursorAdapter放入一個AsyncTask並避免ANR。

+1

爲什麼如果數據太舊,新的數據可以在網上找到,然後在遊標中使用它,不是更新數據庫嗎? – user370305

+0

我想直接從網頁顯示數據,然後在後臺更新數據庫。 –

+0

我不建議直接從網絡顯示數據,而是建議您首先更新數據庫,然後使用光標顯示該數據。因此,您可以避免使用arraylist,也可以重新解析數據以供顯示並存儲在數據庫中。 – user370305

回答

2

我認爲你可以編寫一個自定義適配器,擴展BaseAdapter類並將它用於這兩種情況。

在您的類中,擴展了BaseAdapter,您將有一個List<DataEntry>,其中DataEntry是Java POJO類,表示來自web或db的數據(假設它具有相同的屬性)。假設你已經用DataEntry對象填充了List<DataEntry>,已經包含了你可以執行的數據,如下所示:

1)在擴展BaseAdapter的類的getView()方法中,你將使用xml佈局,這就是基本上代表1個數據行。假設您將通過TextView顯示數據,則1個數據行佈局將具有與DataEntry對象的數據字段數一樣多的TextView元素。在充氣之後,你把像TextViews值:在這個過程中,你更新你的佈局的UI

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'是與當前Activity相關聯的上下文,您可以從中調用。

類的結構,它延伸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

我很喜歡你的想法,但有點擔心我能夠以包含DBCursor和ArrayAdapter的功能的方式擴展BaseAdapter .... –

+0

我假設來自數據庫和Web的數據可以包裝在「DataEntry 「對象。之後,您只使用您的適配器來顯示數據。 – hovanessyan

+0

好吧我要去尋找一些關於擴展BaseAdapter的教程,並選擇你的答案,如果我可以得到它的工作......感謝您的答案! –

3

當然你也可以使用一個SimpleCursorAdapterAsyncTask。但是通過Android Compatibility Package,您可以開始在Android 1.6上使用CursorLoader API。 Loader API可以更輕鬆地管理Cursors的生命週期。

我建議使用CursorLoader API從ContentProvider或數據庫檢索Cursor。並使用AsyncTask(或AsyncLoader的自定義實現)從服務器獲取數據並更新ContentProvider

如果您使用兩個不同AsyncTasks(或Loaders)爲每個任務(光標加載和更新數據),你可以讓你的ListView自動更新,如果在數據庫中的數據發生了變化。

這樣做設置的通知Uri在您從數據庫中檢索到的Cursor

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

如果你有更新的數據,發送爲Uri通知:

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

謝謝你的回答;這可能是最好的長期解決方案,但對於截止日期的目的,我現在正在實施類似於其他答案的方式。 –