4

我正在制作一个新的 Android 应用程序,它基本上反映了我们网站上可用的数据。GUI 将显示ListView每个项目中的图像和文本,或者RelativeLayout显示单个项目的详细信息。

为了提高这个应用程序的响应能力,如果数据足够新,我想从内部数据库读取数据,如果内部数据太旧,我想从服务器的 API(通过 http 的 JSON)读取数据(然后填充带有新数据的内部数据库)。

SimpleCursorAdapter从基本教程来看,从内部数据库读取时似乎应该使用数据库和(*)。但是当从网上阅读时,我想我会使用ArrayListand ArrayAdapter

是否有某种类型的适配器可以处理这两种情况?

(*) 我知道最新的事情是将 LoaderManager 与 CursorLoader 一起使用,但我正在尝试支持 Android 2.1。我想我可以将 SimpleCursorAdapter 放入 AsyncTask 并避免 ANR。

4

2 回答 2

3

当然你可以使用 aSimpleCursorAdapter和 an AsyncTask。但是通过Android 兼容包,您可以开始在CursorLoaderAndroid 1.6 中使用 API。Loader API 使管理Cursors.

我建议使用CursorLoaderAPICursor从 aContentProvider或数据库中检索 a。并使用AsyncTask(或 AsyncLoader 的自定义实现)从服务器获取数据并更新ContentProvider

如果您为每个任务(加载游标和更新数据)使用两个不同的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 的数据(假设它具有相同的属性)。假设您已经填充了List<DataEntry>DataEntry 对象,已经包含数据,您可以执行以下操作:

1) 在扩展 BaseAdapter 的类的 getView() 方法中,在 inflate 中,您将使用 xml 布局,基本上代表 1 个数据行。假设您将通过 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);   

listOfEntryDataObjectsList<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 
} 
于 2011-11-08T10:46:16.827 回答