繁体   English   中英

Android自定义光标适配器

[英]Android custom cursor adapter

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

我有一个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;
    } 

据我所知,您正在使用的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);
       }       
    }
}

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

所以用下面的代码

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM