Я знаю, как получить доступ к элементу listview через onitemclicklistener, но как мне сделать что-то вроде изменения цвета фона в коде.
sudo code:
lv[0].setBackgroundResource(R.color.red); //change the background of the first listview item
Есть ли способ получить доступ к каждому представлению списка?
@Matt: Это не то, что он слабый, вам просто нужно понять, как это работает.
Yellavon, в любой момент времени ваш ListView содержит только видимые элементы, поэтому вы не можете напрямую обращаться к ним и изменять их. Когда они прокручиваются вне поля зрения, представления перерабатываются и заполняются данными с помощью ListAdapter. Внутри этого адаптера вам необходимо обрабатывать случаи, когда элементы должны отличаться. Если вы создали свой собственный ListAdapter (например, ArrayAdapter, BaseAdapter) в своем методе getView()
, просто добавьте некоторую логику для обработки случаев, в которых цвет фона должен измениться.
Скажем, например, у вас есть список целых чисел, и вы хотите, чтобы любое целое число >= 50 отображалось красным:
if(items.get(position) >= 50) {
myView.setBackgroundColor("#FF0000");
} else {
myView.setBackgroundColor("#000000");
}
(Важно иметь дело с другими случаями, так как вы можете получить переработанный вид элемента, который был окрашен в красный цвет. В этом случае вам придется reset его на любой цвет фона по умолчанию, который вы необходимо.)
Если вы никогда не строили пользовательский адаптер, этот отрывок из книги CommonsWare о создании пользовательских списков-списков - отличный ресурс.
EDIT: Дальше подумайте, основываясь на вашем комментарии:
В вашем настраиваемом ExpandableListAdapter
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
}
Посмотрите этот пример
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 - это метод, который вы ищете.
Класс ListView в android слаб.
Короткий ответ на ваш вопрос - нет, не так легко.
Кто-то спросил об этом в Google I/O, и ответ от команды android должен был использовать вертикальное заполнение LinearLayout и просто добавить в него стек дочерних представлений (что в основном дает ему ту же функциональность, что и ListView).
Вы можете сделать getChild (x) для получения любого из представлений
expandableListAdapter
) У меня естьgetChildView
, который получаетgroupPosition
,childPosition
,convertView
иparentView
. Проблема в том, что мне нужно изменить фон, основываясь на последнем дочернем представлении, которое было нажато. Можно ли воткнуть какой-нибудьonclicklistener
в этот метод? Кроме того, как я могу сохранить, какой вид был нажат? Благодарю.Object
). Затем при каждом нажатии на элемент установите его как последний выбранный элемент. Затем в вашемgetView()
объект и обработайте свою логику на основе этого.