我有一个 CursorAdapter 用于从数据库中获取的一些数据和从 WebService 中获取的另一组数据,有没有办法为他们两个使用一个适配器(所以我可以将它设置为单个 ListView)知道它们属于同类型?
我已经使用 Loader 实现从后台的两个数据源中获取。
我有一个 CursorAdapter 用于从数据库中获取的一些数据和从 WebService 中获取的另一组数据,有没有办法为他们两个使用一个适配器(所以我可以将它设置为单个 ListView)知道它们属于同类型?
我已经使用 Loader 实现从后台的两个数据源中获取。
如果两个源都提供相同的类型,您应该能够使用自定义列表适配器。从您的加载程序调用 setList() 和适配器应该完成其余的工作。
下面是一个示例骨架实现:
public class MyListAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;
private ArrayList<T> list;
public CartListAdapter(Context context) {
this.context = context;
}
public void setList (ArrayList<T> list) {
this.list = list;
}
@Override
public int getCount() {
return ((list == null) ? 0 : list.size());
}
@Override
public Object getItem (int position) {
// In theory we should not be called if getCount() returned 0;
return list.get(position);
}
@Override
public long getItemId (int position) {
return position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
}
if (list == null) {
//Incase something crazy happens put something here to allow graceful failure
}
ViewHolder holder = null;
if (convertView != null)
holder = (ViewHolder) convertView.getTag();
if (holder == null) // not the right view
convertView = null;
if (convertView == null) {
convertView = //your custom list view layout
holder = new ViewHolder();
//Assign the different views to your holder
convertView.setTag(holder);//Store the holder in the tag
}
else holder = (ViewHolder) convertView.getTag();
//Populate your views from your list
return convertView;
}
private LayoutInflater getLayoutInflator() {
if (layoutInflater == null) {
layoutInflater = (LayoutInflater)
this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
return layoutInflater;
}
static class ViewHolder {
//Place your views here
}
}
从您的评论看来,您正在寻找混合适配器。我以前没有尝试过实现这一点。我的第一个冲动是修改上面的骨架,使其具有一个公共方法,该方法设置一个布尔值来决定您正在使用哪个数据源。就像是:
public void useCursorData(boolean cursorIsSource)
然后测试覆盖中的数据源,例如:
@Override
public int getCount() {//this was written in off the cuff so there might be some minor errors.
if (cursorIsSource)
return cursor.getCount();
else
return list.size();
}
请记住,使用混合适配器可能会导致您的 onClickListeners 出现困难。例如,当使用游标时,位置是显示索引,id 是行 id。相反,当使用支持数组的适配器时,位置和 id 都引用数组中的位置。