我正在制作一个新的android应用程序,它基本上反映了我们网站上的数据。图形用户界面将在每个项目中显示一个带有图像和文本的ListView,或者显示单个项目的详细信息的RelativeLayout
为了提高这个应用程序的响应性,如果数据足够新,我想从内部数据库读取数据;如果内部数据太旧,我想从服务器的api(json over http)读取数据(然后用新数据填充内部数据库)。
从基本教程来看,从内部数据库读取数据时,似乎应该使用db和SimpleCursorAdapter(*)。但当我从网上阅读时,我想我会使用ArrayListArrayAdapter
是否有某种类型的适配器可以处理这两种情况?
(*)我知道最新的做法是将loadermanager与cursorloader结合使用,但我正在尝试支持android 2.1。我想我可以把simplecursoradapter放到一个异步任务中,从而避免anr。

最佳答案

我认为您可以编写一个自定义适配器,扩展baseadapter类并将其用于这两种情况。
在扩展BaseAdvor的类中,您将有一个List<DataEntry>,其中DATAEnter是Java POJO类,表示来自Web或DB的数据(假设它具有相同的属性)。假设您已经用dataentry对象填充了List<DataEntry>,其中已经包含数据,那么您可以执行以下操作:
1)在扩展BaseAdapter的类的getView()方法中,在inflate中,您将使用一个XML布局,它基本上表示一个数据行。假设您将通过textview显示数据,那么1数据行布局将具有与dataentry对象的数据字段数量相同的textview元素。充气后,您可以在文本视图中输入值,如:

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

2)在更新布局中的用户界面的过程中,您应该具有如下列表视图:
    <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);

entrydataobjects列表已填充数据。构造函数中的“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
}

09-29 22:42