#android #listview
#Android #listview
Вопрос:
Я знаю, как получить доступ к элементу listview через onitemclicklistener, но как мне сделать что-то вроде изменения цвета фона в коде.
код sudo:
lv[0].setBackgroundResource(R.color.red); //change the background of the first listview item
Есть ли способ получить доступ к каждому представлению listview?
Ответ №1:
@Matt: Дело не в том, что это слабо, вам просто нужно понять, как это работает.
Йеллавон, в любой момент времени ваш ListView содержит только видимые элементы, поэтому вы не можете получить доступ к элементам напрямую и изменить их. Когда они прокручиваются вне поля зрения, представления перерабатываются и заполняются данными с помощью ListAdapter. Именно в этом адаптере вам нужно обрабатывать случаи, когда элементы должны отличаться. Если вы создали свой собственный пользовательский ListAdapter (например, ArrayAdapter, BaseAdapter), в вашем getView()
методе просто добавьте некоторую логику для обработки случаев, в которых цвет фона должен измениться.
Допустим, например, у вас есть список целых чисел, и вы хотите, чтобы любое целое число > = 50 отображалось красным цветом:
if(items.get(position) >= 50) {
myView.setBackgroundColor("#FF0000");
} else {
myView.setBackgroundColor("#000000");
}
(Важно убедиться, что обработаны случаи else, так как вы можете получить переработанный вид элемента, который был окрашен в красный цвет. В этом случае вам придется сбросить его на любой цвет фона по умолчанию, который вам нужен.)
Если вы никогда не создавали пользовательский адаптер, этот отрывок из книги CommonsWare о создании пользовательских адаптеров списков — отличный ресурс.
РЕДАКТИРОВАТЬ: Дальнейшая мысль, основанная на вашем комментарии:
В вашем пользовательском расширяемом адаптере списков
private Object lastSelectedObject;
public void setLastSelectedObject(Object obj) {
lastSelectedObject = obj;
}
public Object getLastSelectedObject() {
return lastSelectedObject;
}
Внедрите onListItemClick(ListView l, View v, int pos, long id)
в свой ListActivity
@Override
protected void onListItemClick(ListView l, View v, int pos, long id) {
super.onListItemClick(l, v, pos, id);
((CustomAdapter)l.getAdapter()).setLastSelectedObject(items.get(pos));
}
Теперь вернемся в getView()
Object obj = getLastSelectedObject();
if(obj != null) {
//handle background switching for your View here
} else {
//reset background to default for recycled views
}
Комментарии:
1. У меня есть пользовательский listadapter (на самом деле это пользовательский
expandableListAdapter
) У меня есть,getChildView
который получаетgroupPosition
,childPosition
convertView
иparentView
. Проблема в том, что мне нужно изменить фон на основе последнего дочернего вида, на который был нажат. Могу ли я вставить что-тоonclicklistener
в этот метод? Кроме того, как мне сохранить, на какое представление был нажат? Спасибо.2. А, понятно. Я добавил несколько дополнительных предложений для вас. В принципе, добавьте закрытую переменную в свой ListAdapter, чтобы отслеживать последний элемент, на который нажали (просто замените любой тип вашего класса элементов на
Object
).). Затем, всякий раз, когда нажимается элемент, установите его в качестве последнего выбранного элемента. Затем в вашемgetView()
извлеките объект и обработайте свою логику на основе этого.
Ответ №2:
Взгляните на этот пример
int first = view.getFirstVisiblePosition();
int count = view.getChildCount();
for (int i=0; i<count; i ) {
TextView t = (TextView)view.getChildAt(i);
if (t.getTag() != null) {
t.setText(mStrings[first i]);
t.setTag(null);
}
}
Похоже, что getChildAt — это метод, который вы ищете.
Ответ №3:
Класс ListView в Android слаб.
Короткий ответ на ваш вопрос — нет, нелегко.
Кто-то спросил об этом в Google I / O, и ответ от команды Android заключался в том, чтобы использовать LinearLayout с вертикальным заполнением и просто добавить в него стек дочерних представлений (что в основном дает ему ту же функциональность, что и ListView).
Вы можете выполнить getChild(x), чтобы получить любое из представлений