Изображение, появляющееся в первой записи ListView, когда оно не должно появляться
Это правая часть ListView в приложении, над которым я работаю.
Как вы можете видеть, ImageView
отображение звезды появляется дважды в списке из 9 записей.
Это метод BindView, который ListView
"s CursorAdapter
использует:
@Override
public void bindView(View v, Context context, Cursor c) {
AQuery aq = new AQuery(v);
MyDatabaseHelper helper = new MyDatabaseHelper(context); //Used for various bits of text-setting. Is largely unrelated to the question.
boolean isDefault = (c.getShort(c.getColumnIndexOrThrow(MyDatabaseHelper.DEFAULT))==1);
Log.d("Binding account to view", "Entry "+currentID+"isDefault: "+isDefault);
v.setTag(isDefault);
if (isDefault) {
aq.id(R.id.favStar).visible(); //favStar defaults to GONE.
}
helper.close();
}
Как вы можете видеть, он проверяет, читает ли столбец в моей базе данных 1, а затем сохраняет этот бит логической математики в переменной. С помощью этой переменной он помечает View
сообщает о состоянии этой переменной, а затем делает звезду видимой, если и только если переменная имеет значение true.
Это вывод журнала из заполняемого списка до добавления 9-й записи:
02-28 10:50:23.381: D/Binding account to view(20759): Entry 1isDefault: false
02-28 10:50:23.397: D/Binding account to view(20759): Entry 2isDefault: false
02-28 10:50:23.413: D/Binding account to view(20759): Entry 3isDefault: false
02-28 10:50:23.420: D/Binding account to view(20759): Entry 4isDefault: false
02-28 10:50:23.436: D/Binding account to view(20759): Entry 5isDefault: false
02-28 10:50:23.444: D/Binding account to view(20759): Entry 6isDefault: false
02-28 10:50:23.459: D/Binding account to view(20759): Entry 7isDefault: false
02-28 10:50:23.475: D/Binding account to view(20759): Entry 8isDefault: true
02-28 10:50:23.498: D/Binding account to view(20759): Entry 1isDefault: false
02-28 10:50:23.506: D/Binding account to view(20759): Entry 2isDefault: false
02-28 10:50:23.530: D/Binding account to view(20759): Entry 3isDefault: false
02-28 10:50:23.553: D/dalvikvm(20759): GC_CONCURRENT freed 122K, 2% free 11069K/11271K, paused 3ms+15ms, total 43ms
02-28 10:50:23.553: D/Binding account to view(20759): Entry 4isDefault: false
02-28 10:50:23.577: D/Binding account to view(20759): Entry 5isDefault: false
02-28 10:50:23.592: D/Binding account to view(20759): Entry 6isDefault: false
02-28 10:50:23.600: D/Binding account to view(20759): Entry 7isDefault: false
02-28 10:50:23.616: D/Binding account to view(20759): Entry 8isDefault: true
(Добавление 9-й записи просто добавляет "Entry 9isDefault:false" к выводу журнала.)
Может кто-нибудь сказать мне, почему в моем списке появляется звезда, где отмечены журналы отладки, которые не должны появляться? Ни ListFragment
что это ListView
появляется в, ни активность, в которой находится ListFragment
делайте любые ссылки на R.id.favStar где угодно.
Для дальнейшего уточнения: я также попробовал это без использования AQuery (используя FindViewById()
а также setVisible()
) и результаты не изменились на ожидаемые результаты, показанные в журналах отладки. Звезда с ошибками всегда появляется в первой позиции и появляется, только если предполагается, что другая звезда в списке появляется. (Класс DatabaseHelper устанавливает все элементы в базе данных на ISDEFAULT=0, прежде чем устанавливать что-либо с ISDEFAULT=1.) Достаточно странно, если использовать шаблон, который ADT дает вам для потока Master/Detail, эта ошибка не воспроизводится на моем Nexus 7, но можно найти как на моем Galaxy Nexus, так и на эмуляторе.
1 ответ
Вы никогда не скрываете свой вид в избранном, если isDefault
ложно Если для вашего элемента установлено значение true, и вы показываете вид, звезда будет видна до тех пор, пока вы ее снова не скроете. Когда вид будет переработан, звезда все равно будет отображаться, даже если это не предполагалось. Вы не видите его на своем Nexus 7, потому что у вас может не хватить элементов для этого, так как его экран выше, чем у телефона. В любом случае, изменение кода на что-то вроде этого должно исправить это:
if (isDefault) {
aq.id(R.id.favStar).visible(); //favStar defaults to GONE.
} else {
//set favStar to View.GONE here
}