我正在制作一个新的android应用程序,它基本上反映了我们网站上的数据。图形用户界面将在每个项目中显示一个带有图像和文本的ListView
,或者显示单个项目的详细信息的RelativeLayout
。
为了提高这个应用程序的响应性,如果数据足够新,我想从内部数据库读取数据;如果内部数据太旧,我想从服务器的api(json over http)读取数据(然后用新数据填充内部数据库)。
从基本教程来看,从内部数据库读取数据时,似乎应该使用db和SimpleCursorAdapter
(*)。但当我从网上阅读时,我想我会使用ArrayList
和ArrayAdapter
。
是否有某种类型的适配器可以处理这两种情况?
(*)我知道最新的做法是将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
}