Android: использовать текстовый счетчик в CursorAdapter - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть ListView, который заполнен SimpleCursorAdapter. Одно из полей, которое должно отображаться в этом представлении (TBTsqlHelperBudgets.KEY_INTERVAL), хранится в БД как int (индекс счетчика, который используется для ввода). Но я хотел бы показать текст, а не индекс в ListView. Есть предложения?

public class TBTTManageBudgetsActivity extends Activity {
    // ...
    // some stuff 
    // ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...
        // some stuff 
        // ...
                cursor = getBudgets();
                String[] uiBindFrom = { TBTsqlHelperBudgets.KEY_NAME, TBTsqlHelperBudgets.KEY_BUDGET, TBTsqlHelperBudgets.KEY_INTERVAL };               
                int[] uiBindTo = { R.id.name, R.id.budget, R.id.interval};
                cursor.moveToFirst();
                CursorAdapter adapter = new SimpleCursorAdapter(this.getApplicationContext(), R.layout.list_budgets_item, cursor, uiBindFrom, uiBindTo);                
                listView.setAdapter(adapter);
        // ...
        // some stuff 
        // ...
    }
    // ...
    // some stuff 
    // ...
}

Кстати: спиннер настроен с использованием массива xml:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.intervals, android.R.layout.simple_spinner_item);

с xml:

<resources>
    <string-array name="intervals">
        <item>per day</item>
        <item>per week</item>
        <item>per month</item>
        <item>per year</item>
    </string-array>
</resources>

1 Ответ

1 голос
/ 13 декабря 2011

Если вы просто хотите отобразить текст (в отличие от возможности его редактировать), вы можете использовать что-то вроде этого для преобразования или поиска на лету.Он просто оборачивает ваш курсор, и вы задаете, какие столбцы нуждаются в особой обработке.Все остальные обрабатываются базовым объектом Cursor:

package com.awc.util;

import java.text.DateFormat;
import java.util.Date;

import android.content.ContentResolver;
import android.database.CharArrayBuffer;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

public class ConversionAndLookupCursor implements Cursor {
private static final String TAG = ConversionAndLookupCursor.class.getSimpleName();


private Cursor wrapped;
private Converter converters[];


public ConversionAndLookupCursor(Cursor wrapped) {
    if(wrapped == null) {
        throw new NullPointerException("wrapped");
    }

    this.wrapped = wrapped;
    this.converters = new Converter[wrapped.getColumnCount()];
}


@Override
public void close() {
    wrapped.close();
}

@Override
public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
    Converter c;
    String s;


    Log.d(TAG, "Converting " + columnIndex);
    c = converters[columnIndex];
    if(c != null) {
        s = c.convertFrom(wrapped.getLong(columnIndex));
        buffer.data = s.toCharArray();
    } else {
        wrapped.copyStringToBuffer(columnIndex, buffer);
    }
}

@Override
public void deactivate() {
    wrapped.deactivate();
}

@Override
public byte[] getBlob(int columnIndex) {
    return wrapped.getBlob(columnIndex);
}

@Override
public int getColumnCount() {
    return wrapped.getColumnCount();
}

@Override
public int getColumnIndex(String columnName) {
    return wrapped.getColumnIndex(columnName);
}

@Override
public int getColumnIndexOrThrow(String columnName)
        throws IllegalArgumentException {
    return wrapped.getColumnIndexOrThrow(columnName);
}

@Override
public String getColumnName(int columnIndex) {
    return wrapped.getColumnName(columnIndex);
}

@Override
public String[] getColumnNames() {
    return wrapped.getColumnNames();
}

@Override
public int getCount() {
    return wrapped.getCount();
}

@Override
public double getDouble(int columnIndex) {
    return wrapped.getDouble(columnIndex);
}

@Override
public Bundle getExtras() {
    return wrapped.getExtras();
}

@Override
public float getFloat(int columnIndex) {
    return wrapped.getFloat(columnIndex);
}

@Override
public int getInt(int columnIndex) {
    return wrapped.getInt(columnIndex);
}

@Override
public long getLong(int columnIndex) {
    return wrapped.getLong(columnIndex);
}

@Override
public int getPosition() {
    return wrapped.getPosition();
}

@Override
public short getShort(int columnIndex) {
    return wrapped.getShort(columnIndex);
}

@Override
public String getString(int columnIndex) {
    Converter c;
    Long value = null;
    String s;


    c = converters[columnIndex];
    if(c != null) {
        Log.d(TAG, "Converting in getString(" + columnIndex + ")");
        if(!wrapped.isNull(columnIndex)) {
            value = wrapped.getLong(columnIndex);
        }
        s = c.convertFrom(value);
    } else {
        s = wrapped.getString(columnIndex);
    }

    return s;
}

@Override
public boolean getWantsAllOnMoveCalls() {
    return wrapped.getWantsAllOnMoveCalls();
}

@Override
public boolean isAfterLast() {
    return wrapped.isAfterLast();
}

@Override
public boolean isBeforeFirst() {
    return wrapped.isBeforeFirst();
}

@Override
public boolean isClosed() {
    return wrapped.isClosed();
}

@Override
public boolean isFirst() {
    return wrapped.isFirst();
}

@Override
public boolean isLast() {
    return wrapped.isLast();
}

@Override
public boolean isNull(int columnIndex) {
    return wrapped.isNull(columnIndex);
}

@Override
public boolean move(int offset) {
    return wrapped.move(offset);
}

@Override
public boolean moveToFirst() {
    return wrapped.moveToFirst();
}

@Override
public boolean moveToLast() {
    return wrapped.moveToLast();
}

@Override
public boolean moveToNext() {
    return wrapped.moveToNext();
}

@Override
public boolean moveToPosition(int position) {
    return wrapped.moveToPosition(position);
}

@Override
public boolean moveToPrevious() {
    return wrapped.moveToPrevious();
}

@Override
public void registerContentObserver(ContentObserver observer) {
    wrapped.registerContentObserver(observer);
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
    wrapped.registerDataSetObserver(observer);
}

@Override
public boolean requery() {
    return wrapped.requery();
}

@Override
public Bundle respond(Bundle extras) {
    return wrapped.respond(extras);
}

@Override
public void setNotificationUri(ContentResolver cr, Uri uri) {
    wrapped.setNotificationUri(cr, uri);
}

@Override
public void unregisterContentObserver(ContentObserver observer) {
    wrapped.unregisterContentObserver(observer);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
    wrapped.unregisterDataSetObserver(observer);
}


////////////////////////////////////
// DATA CONVERSION STUFF
////////////////////////////////////
public void setDateConversion(int column) {
    converters[column] = new DateConverter();
}

public void setLookupConversion(int column, Cursor lookup, int lookupColumn) {
    converters[column] = new LookupConverter(lookup, lookupColumn);
}

public void clearConversion(int column) {
    converters[column] = null;
}

private interface Converter {
    public String convertFrom(Object value);
}

private class DateConverter implements Converter {
    private DateFormat fmt;


    public DateConverter() {
        fmt = DateFormat.getDateInstance(DateFormat.SHORT);
    }

    public String convertFrom(Object value) {
        String s = null;


        if(value != null && value instanceof Long) {
            s = fmt.format(new Date((Long)value));
        }

        return s;
    }
}

private class LookupConverter implements Converter {
    private Cursor lookup;
    private int lookupColumn;

    public LookupConverter(Cursor lookup, int column) {
        if(lookup == null) throw new NullPointerException("lookup");

        this.lookup = lookup;
        this.lookupColumn = column;
    }

    public String convertFrom(Object id) {
        String s = null;


        if(id != null && id instanceof Long) {
            lookup.moveToPosition(((Long)id).intValue());
            s = lookup.getString(lookupColumn);
        }

        return s;
    }
}
}
...