Использование SimpleCursorAdapter.ViewBinder для изменения цвета TextView - PullRequest
3 голосов
/ 11 марта 2012

Я разрабатываю приложение будильника для Android и хочу, чтобы список аварийных сообщений отображался на главном экране Каждая строка этого ListView определена в XML-файле. И я хочу иметь отдельные TextViews для каждого дня недели. Программа проверит в sqlite db, если, например. значение для monday равно = 1, а затем измените цвет этого TextView на красный. Я написал этот код, но это не работает. Что не так?

private void fillData() {

    // Get all of the notes from the database and create the item list
    Cursor c = db.fetchAllAlarms();
    startManagingCursor(c);

    String[] from = new String[] { db.KEY_TIME, db.KEY_NAME };
    int[] to = new int[] { R.id.time, R.id.alarmName };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter alarms =
        new SimpleCursorAdapter(this, R.layout.alarm_row, c, from, to);
        alarms.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            int dayOfWeekIndex = cursor.getColumnIndex("mon");
            if (dayOfWeekIndex == columnIndex) {
                int color = cursor.getInt(dayOfWeekIndex);
                switch(color) {
                case 0: ((TextView) view).setTextColor(Color.RED); break;
                case 1: ((TextView) view).setTextColor(Color.GRAY); break;
                }
                return true;
            }
            return false;
        }
    });

Ответы [ 2 ]

7 голосов
/ 12 марта 2012

Из документации Android по SimpleCursorAdapter.ViewBinder:

Связывает столбец курсора, определенный указанным индексом, с указанный вид. Когда привязка обрабатывается этим ViewBinder, это метод должен вернуть true. Если этот метод возвращает ложь, SimpleCursorAdapter попытается обработать привязку самостоятельно.

Другими словами, ваша реализация setViewValue не должна быть специфической для любого View, так как SimpleCursorAdapter будет вносить изменения в каждый View (в соответствии с вашей реализацией), когда он заполняет ListView. setViewValue - это, по сути, ваш шанс сделать все, что вы пожелаете, с данными в Cursor, включая настройку цвета ваших представлений. Попробуйте что-то вроде этого,

public boolean setViewValue(View view, Cursor cursor, int columnIndex){    
    // if this holds true, then you know that you are currently binding text to
    // the TextView with id "R.id.alarmName"
    if (view.getId() == R.id.alarmName) {
        final int dayOfWeekIndex = cursor.getColumnIndex("day_of_week");
        final int color = cursor.getInt(dayOfWeekIndex);

        switch(color) {
        case 0: ((TextView) view).setTextColor(Color.RED); break;
        case 1: /* ... */ break;
        case 2: /* ... */ break;
        /* etc. */
        }
        return true;
    }
    return false;
}

Обратите внимание, что в приведенном выше коде используется столбец с именем "day_of_week", в котором содержится значение int 0-6 (для указания конкретного дня недели).

2 голосов
/ 12 марта 2012

Из документации Android по SimpleCursorAdapter.ViewBinder:

Связывает столбец курсора, определенный указанным индексом, с указанным представлением.Когда привязка обрабатывается этим ViewBinder, этот метод должен возвращать true.Если этот метод возвращает false, SimpleCursorAdapter попытается обработать привязку самостоятельно.

Другими словами, ваша реализация setViewValue не должна быть специфичной для какого-либо одного View, как SimpleCursorAdapter внесет изменения в каждый View (в соответствии с вашей реализацией), когда он заполнит ListView.Ваша реализация должна выглядеть примерно так:

notes.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        int dayOfWeekIndex = cursor.getColumnIndex("day_of_week");
        if (dayOfWeekIndex == columnIndex) {
            int color = cursor.getInt(dayOfWeekIndex);
            switch(color) {
            case 0: ((TextView) view).setTextColor(Color.RED); break;
            case 1: /* ... */ break;
            case 2: /* ... */ break;
            /* etc. */
            }
            return true;
        }
        return false;
    }
});

Обратите внимание, что в приведенном выше коде предполагается столбец с именем "day_of_week", который содержит значение int 0-6 (для указания определенного дня недели).

...