Пользовательский адаптер курсора Android - PullRequest
2 голосов
/ 24 июня 2011

Я создал специальный адаптер курсора, который выбирает значение из базы данных и отображает его в моем определенном представлении.

У меня есть один просмотр текста и просмотр изображений.Зависит от текста в базе данных, изображение меняется соответственно.Я определил 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 ]

5 голосов
/ 30 июня 2011

Насколько я могу судить, единственная часть SimpleCursorAdapter, которую вы используете, это параметр from, который вы можете легко заменить литеральной строкой, поскольку вы расширяете ее.Хотя я не знаком с «внутренностями» кода, можно с уверенностью предположить, что поскольку getView не упоминается в документации SimpleCursorAdapter, его нельзя переопределить, поскольку это может привести к его поломке, как в вашем примере.

Исходя из того, что у вас есть, я адаптировал его для расширения 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);
       }       
    }
}
0 голосов
/ 24 июня 2011

Для сравнения значения двух строк используйте equals() класса String.Не используйте оператор == в этом случае

Поэтому используйте следующий код

if ((cursor.getString(cursor.getColumnIndex("category"))).equals("Urgent")){
        holder.imageView.setImageResource(R.drawable.urgent);
    }else{
        holder.imageView.setImageResource(R.drawable.reminder);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...