一种将适配器与来自不同资源的数据提取合并的方法

时间:2013-04-13 21:55:58

标签: android listview adapter listadapter android-cursoradapter

我有一个CursorAdapter用于从数据库获取的一些数据和另一组从WebService获取的数据,有没有办法使用一个适配器(所以我可以为单个ListView设置它),因为他们都知道它们属于同一类型?

我已经使用Loader实现来从背景中的两个数据源中获取。

1 个答案:

答案 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都引用数组中的位置。