我有一个CursorAdapter用于从数据库获取的一些数据和另一组从WebService获取的数据,有没有办法使用一个适配器(所以我可以为单个ListView设置它),因为他们都知道它们属于同一类型?
我已经使用Loader实现来从背景中的两个数据源中获取。
答案 0 :(得分:0)
如果两个源提供相同的类型,您应该能够使用自定义列表适配器。从你的加载器调用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();
}
请记住,使用混合适配器可能会导致onClickListener出现问题。例如,当使用游标时,position是显示索引,id是行id。相反,当使用数组支持的适配器时,position和id都引用数组中的位置。