ViewBinder изменяет только один элемент во всех строках ListView

У меня есть ListView это заселено из SimpleCursorAdapter каждая строка, содержащая 3 разных TextViews, Я хочу изменить только один из TextViews для всех рядов с ViewBinder (R.id.text65), однако обновляет все 3 TextViews каждого ряда. Вот мой код:

cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            sign = (TextView) view;
            SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String currency1 = currency.getString("Currency", "$");
                    sign.setText(currency1);

                    return true;
        }
    });

PS я пробовал (TextView) findViewById(R.id.text65); и я получил Force close,

1 ответ

Решение

Решение 1:

Вы должны проверить индекс столбца в viewbinder:

       public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
           if (columnIndex == cursor.getColumnIndexOrThrow(**??**)) // 0 , 1 , 2 ?? 
            {
               sign = (TextView) view;
               SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                String currency1 = currency.getString("Currency", "$");
                    sign.setText(currency1);

                    return true;
             }
             return false;
        }

Обратите внимание, что индекс столбца - это индекс DBcolumn валюты / индекса столбца в любом источнике данных.

Решение 2:

Вы, вероятно, определяете int[] для полей для привязки в вашем listview например:

            // and an array of the fields we want to bind those fields to
    int[] to = new int[] { R.id.field1, R.id.field2, R.id.Currency };

    SimpleCursorAdapter entries = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);

... условно можно просто сдать 0 вместо идентификаторов макета полей, которые вы не хотите привязывать / показывать.

            int[] to = new int[] { 0, 0, R.id.Currency };

Таким образом, будет привязано только поле Валюта.


Кроме того, причина, по которой вы приближаете силу, заключается в том, что технически text65 в вашем contentView но много. Вы не можете получить к нему доступ с основного уровня макета. Он уникален только в рамках одного ряда.


Обновить:

Решение 3:

Проверить id зрения в ViewBinder

    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        int viewId = view.getId();
        Log.v("ViewBinder", "columnIndex=" + columnIndex + " viewId = " + viewId);
        if(viewId == R.id.text65)
        {
            sign = (TextView) view;
            SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String currency1 = currency.getString("Currency", "$");
            sign.setText(currency1);

            return true;
         }
         return false;
     }

Не могли бы вы попробовать это?

Полезный совет: вы можете использовать Log.v проверить определенные значения в вашем коде без необходимости его отладки.

Надеюсь, поможет.