2011-11-08 113 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

谢谢你的回答;这可能是最好的长期解决方案,但对于截止日期的目的,我现在正在实施类似于其他答案的方式。 –