2013-11-13 2 views
6

У меня есть андроид listview. Я хочу изменить фон элемента списка, когда я нажимаю один элемент списка.Android listview item background change

, а затем предыдущий выбранный элемент должен вернуться к фону по умолчанию. это означает, что нужно выбрать только один элемент.

Я долго искал его. Я могу изменить фон выбранного элемента, используя onItemClick()

, но я не могу изменить предыдущий выбранный элемент. например, если я выбираю второй элемент, он был изменен. и затем я выбираю третий элемент. о мой Бог! он тоже изменился! что я могу сделать для этого. как я могу получить предыдущую позицию?

вот мой код андроид.

private class ListViewItemClickListener implements 
      AdapterView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 

      TextView title = (TextView) view.findViewById(R.id.title); 
      title.setBackgroundResource(R.drawable.list_shape); 

     } 
    } 

ответ

1

Когда у меня есть это в подобном примере я глобальное поле с именем:

selectedListItem; 

Это будет обновляться в вашем onitemClickListener и предыдущий пункт будет тогда иметь это фон возвращается к значению по умолчанию.

Так обновить код:

private class ListViewItemClickListener implements 
     AdapterView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     //First update the previously selected item if one has been set 
     if(selectedListItem!=null){ 
      TextView previousTitle = (TextView) selectedListItem.findViewById(R.id.title); 
      previousTitle.setBackgroundResource(R.drawable.list_default_background); 
     } 
     //Then update the new one 
     TextView title = (TextView) view.findViewById(R.id.title); 
     title.setBackgroundResource(R.drawable.list_shape); 
     selectedListItem = view; 

    } 
} 

Так просто initalise selectedListItem как поле в адаптере с onClickListener как внутренний класс, и ваш по умолчанию фон рисуем вместо list_default_background.

В качестве альтернативы вы можете отслеживать номера позиций вместо фактического вида.

EDIT:

Чтобы использовать этот метод для вашего списка вы также должны следить за идентификатор или экземпляр объекта для конкретного элемента списка. В моем собственном решении, в методе getView моего ListAdapter я убеждаюсь, что обновляется только элемент списка, который соответствует идентификатору/экземпляру правильного элемента. С вашим кодом, как и вы, вы также обнаружите, что при прокрутке вниз вид в той же позиции в этом списке видимых элементов также обновляется. Это связано с тем, что просмотр списка относится к списку в наборах элементов, где каждый набор соответствует элементам, видимым на экране в любой момент времени.

Чтобы обновить особый, конкретный элемент, лучше всего подходит для использования фона селектора или индикатора, как указано в других ответах.

НТН

+0

Hi Selvin. Это решит то, что спросил ОП. Проблема фона представления, повторно применяемого к каждому видимому списку, является отдельной проблемой и вызвана исходным методом. – sturrockad

+0

Нет, это не будет ... Потому что listview - это повторное использование элементов! Если элемент «выбрать» прокручивает этот элемент из видимых элементов 1. Некоторые другие элементы могут быть «выбраны» 2. Если вы сделаете этот элемент прокруткой назад к видимым элементам, этот элемент может быть выбран не заново! Конец истории – Selvin

+0

Да, но это отдельная проблема. Пользователь спросил, как отменить выбор предыдущего элемента при выборе нового элемента, который отвечает на мой ответ. Я считаю, что ваш комментарий относится к вопросу :) – sturrockad

4

Вы должны использовать встроенные методы выбора элементов в виде списка. Ручное изменение фона подвержено ошибкам, как вы уже нашли.

Добавить этот атрибут в представлении корня в вашем списке следует пункт XML

android:background="?android:attr/activatedBackgroundIndicator" 

затем вызвать setItemChecked(x, true) на вашем ListView, где х это положение элемента, который вы хотите выбрать.

Убедитесь, что ваш ListView имеет ChoiceMode набор, который позволяет выбирать (например, «SingleChoice»)

+0

Я просто tring, чтобы написать то же, что и комментарий :) – Selvin

1

Вы можете изменить цвет ListView пункт щелкать его, как показано ниже. Следуй этим шагам.

(Помните, что это для пользовательского List View)

  1. Создайте файл XML в вытяжке папке как ниже:

    <item android:drawable="@color/orange" android:state_focused="true"/> 
    <item android:drawable="@color/orange" android:state_pressed="true"/> 
    <item android:drawable="@drawable/listview"></item> 
    

    Выберите свои собственные ресурсы.

  2. При реализации пользовательского ListView, у вас будет дополнительный макет для дизайна пользовательского списка. Ниже приведен пример.

    <ImageView 
        android:id="@+id/imageView1" 
        android:layout_width="60dp" 
        android:layout_height="60dp" /> 
    
    <TextView 
        android:id="@+id/textView1" 
        android:layout_width="fill_parent" 
        android:layout_height="60dp" 
        android:layout_toRightOf="@+id/imageView1" 
        android:background="@drawable/listselect_picture" 
        android:gravity="center" 
        android:text="TextView" 
        android:textColor="@drawable/select_txtcolor" 
        android:textSize="16sp" /> 
    

В приведенном выше коде я поставил установить файл XML с шага 1 в качестве "фона" атрибута. Это будет работать так, как вы хотите.

Кроме того, если вы хотите изменить цвет текста на выбор ListItem, используйте ниже XML-код и установите этот XML-файл как атрибут «TextColor».

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_selected="true" android:color="@android:color/white"/> 
    <item android:state_focused="true" android:color="@android:color/white"/> 
    <item android:state_pressed="true" android:color="@android:color/white"/> 
    <item android:color="@android:color/black"/> 

</selector> 

Приведенный выше код изменит цвет текста во время выбора и вернется к оригиналу, когда он будет отброшен.