Android自定义游标适配器

时间:2011-06-24 05:49:56

标签: java android cursor

我创建了一个自定义游标适配器,它从数据库中获取值并将其显示在我定义的视图中。

我有一个textview和imageview。 取决于数据库中的文本图像相应更改。 我已经如下定义了MyArrayAdapter,但它给出了一个错误。

public class MyArrayAdapter extends SimpleCursorAdapter {

    private final Context context;
    private final Cursor cursor;
    private final String[] from;
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }

    public MyArrayAdapter(Context context, int layout, Cursor c, String[] from,
            int[] to) {
        super(context, layout, c, from, to);
        this.context = context;
        this.cursor = c;
        this.from = from;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        ViewHolder holder;
        if (rowView == null) {
            LayoutInflater inflater =  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.todo_row,null,true);
            holder = new ViewHolder();
            holder.textView = (TextView) rowView.findViewById(R.id.todo_edit_summary);
            holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
            rowView.setTag(holder);
        }else{
            holder = (ViewHolder) rowView.getTag();
        }

        String s = cursor.getString(cursor.getColumnIndex(from[0]));
        holder.textView.setText(s);

        if (cursor.getString(cursor.getColumnIndex("category")) == "Urgent"){
            holder.imageView.setImageResource(R.drawable.urgent);
        }else{
            holder.imageView.setImageResource(R.drawable.reminder);
        }

        return rowView;
    }
}

(已删除答案更新)

以下代码工作正常,但它们在ListView的每个条目中显示相同的值。我延长了SimpleCursorAdapter。管理光标我犯了什么错误吗?

public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        ViewHolder holder;
        if (rowView == null) {
            LayoutInflater inflater =  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.todo_row,null,true);
            holder = new ViewHolder();
            holder.textView = (TextView) rowView.findViewById(R.id.label);
            holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
            rowView.setTag(holder);
        }else{
            holder = (ViewHolder) rowView.getTag();
        }

        String s = cursor.getString(cursor.getColumnIndex(from[0]));
        holder.textView.setText(s);

        if ((cursor.getString(cursor.getColumnIndex("category"))).equals("Urgent")){ 
            holder.imageView.setImageResource(R.drawable.reminder);
        }else{
            holder.imageView.setImageResource(R.drawable.urgent);
        }

        return rowView;
    } 

2 个答案:

答案 0 :(得分:5)

据我所知,您使用的SimpleCursorAdapter的唯一部分是from参数,您可以轻松地用文字字符串替换它,因为您正在扩展它。虽然我不熟悉代码的“胆量”,但可以非常安全地假设,因为在SimpleCursorAdapter文档中没有提到getView,所以它并不意味着被轻易覆盖,因为这样做会像你的例子那样打破它。

基于你所拥有的,我已经改编它以扩展CursorAdapter,并将你在getView中的代码分成newView和bindView,两者都被定义为CursorAdapter中的抽象方法。

public class MyCursorAdapter extends CursorAdapter {

    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }

    public MyArrayAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater =  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.todo_row,null,true);

        ViewHolder holder = new ViewHolder();
        holder.textView = (TextView) rowView.findViewById(R.id.todo_edit_summary);
        holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
        rowView.setTag(holder);

        return rowView;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
       ViewHolder holder = (ViewHolder) view.getTag();

       String s = cursor.getString(cursor.getColumnIndex("whatever from[] represented"));
       holder.textView.setText(s);

       if (cursor.getString(cursor.getColumnIndex("category")) == "Urgent"){
           holder.imageView.setImageResource(R.drawable.urgent);
       }else{
           holder.imageView.setImageResource(R.drawable.reminder);
       }       
    }
}

答案 1 :(得分:0)

要比较两个字符串的值,请使用String类的equals()。在这种情况下不要使用==运算符

所以使用以下代码

if ((cursor.getString(cursor.getColumnIndex("category"))).equals("Urgent")){
        holder.imageView.setImageResource(R.drawable.urgent);
    }else{
        holder.imageView.setImageResource(R.drawable.reminder);
    }