ViewBinder изменяет только один элемент во всех строках ListView - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть 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 голос
/ 22 февраля 2012

Решение 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 };

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


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


Обновление:

Решение 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 для проверки определенных значений в вашем кодебез необходимости отладки.

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

...