Как ссылаться на конкретный вид в виде списка

1

Я знаю, как получить доступ к элементу listview через onitemclicklistener, но как мне сделать что-то вроде изменения цвета фона в коде.

sudo code:

lv[0].setBackgroundResource(R.color.red); //change the background of the first listview item

Есть ли способ получить доступ к каждому представлению списка?

Теги:
listview

3 ответа

2
Лучший ответ

@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
}   
  • 0
    У меня есть пользовательский listadapter (Это на самом деле обычай expandableListAdapter ) У меня есть getChildView , который получает groupPosition , childPosition , convertView и parentView . Проблема в том, что мне нужно изменить фон, основываясь на последнем дочернем представлении, которое было нажато. Можно ли воткнуть какой-нибудь onclicklistener в этот метод? Кроме того, как я могу сохранить, какой вид был нажат? Благодарю.
  • 0
    Ах я вижу. Я добавил несколько дополнительных предложений для вас. По сути, добавьте приватную переменную в свой ListAdapter, чтобы отслеживать последний нажатый элемент (просто замените тип класса вашего объекта на Object ). Затем при каждом нажатии на элемент установите его как последний выбранный элемент. Затем в вашем getView() объект и обработайте свою логику на основе этого.
0

Посмотрите этот пример

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 - это метод, который вы ищете.

-1

Класс ListView в android слаб.

Короткий ответ на ваш вопрос - нет, не так легко.

Кто-то спросил об этом в Google I/O, и ответ от команды android должен был использовать вертикальное заполнение LinearLayout и просто добавить в него стек дочерних представлений (что в основном дает ему ту же функциональность, что и ListView).

Вы можете сделать getChild (x) для получения любого из представлений

Ещё вопросы

Сообщество Overcoder
Наверх
Меню