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
проверить определенные значения в вашем коде без необходимости его отладки.
Надеюсь, поможет.