0

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

我已经使用 Loader 实现从后台的两个数据源中获取。

4

1 回答 1

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();
}

请记住,使用混合适配器可能会导致您的 onClickListeners 出现困难。例如,当使用游标时,位置是显示索引,id 是行 id。相反,当使用支持数组的适配器时,位置和 id 都引用数组中的位置。

于 2013-04-13T22:17:32.043 回答