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

#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), чтобы получить любое из представлений