onItemClick в ListView случайным образом меняет цвет фона - PullRequest
2 голосов
/ 31 марта 2012

Я использую элементы ListView с множественным выбором. Пользователь может выбрать несколько элементов. Поэтому я хотел выделить элементы, выбранные пользователем, изменив либо цвет текста, либо цвет фона строки списка. Я прошел через ссылки переполнения стека, но не нашел правильного решения. Когда я пытаюсь это сделать, он случайным образом меняет любой невыбранный цвет фона элемента. Помогите!!!

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    videocursor.moveToPosition(position);
    v.setBackgroundColor(Color.parseColor("#80B7DBE8"));
    SaveSelections();
}

Ответы [ 5 ]

4 голосов
/ 31 марта 2012

Случайно изменяющийся цвет фона вызван тем, что ListView перерабатывает представления в своем списке, чтобы избежать ненужного потребления памяти. Вам необходимо предоставить собственный настраиваемый адаптер, в котором вам необходимо переопределить метод getView и выполнить некоторые проверки, чтобы выделить только те элементы списка, для которых установлен некоторый флаг, установленный в значение true для цвета фона

3 голосов
/ 31 марта 2012

Намного лучше, чем приведенные выше предложения, это использовать селектор, также известный как список состояний, который можно нарисовать.Таким образом, ОС позаботится обо всем, что касается цветовой подсветки и т. Д.

более четко, возьмите следующий xml и сохраните его в res / drawable как что-то вроде li_background.xml (я использую изображения, но не стесняйтесь менять цвета в соответствии с вашей ситуацией)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_focused="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_pressed="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_selected="true"
          android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_selected="true"
          android:drawable="@android:color/black" />
    <item android:drawable="@android:color/transparent" />
</selector>

и установить фон Все ListItems в ListView в значение R.drawable.li_background.если ваш listView правильно настроен на множественный выбор (android:choiceMode="multipleChoice" или listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);, если вы предпочитаете), тогда Android позаботится обо всем остальном.Этот материал недостаточно хорошо документирован, мне было трудно найти решение, и я все время вижу похожие вопросы, но соответствующие значения: здесь и здесь

2 голосов
/ 31 марта 2012

Wagas правильно. В getView вашего адаптера вы получаете представление (называемое convertView автозаполнением Eclipse). Это потому, что ListView s перезапускает представления для каждой строки. Если вы установите свойство для данного View, оно сохранит это свойство при его переработке.

По этой причине вы никогда не должны устанавливать свойства чего-либо в View данного ряда вне метода getView Адаптера, поддерживающего ListView.

Существует несколько способов справиться с этим, но основная идея заключается в том, что вы хотите установить некоторый фрагмент данных, который использует position, переданный в onItemClick, для установки флага. Затем проверьте флаг в getView Адаптера, чтобы решить, как установить фон для строки View.

Например, если можно выбрать только один элемент, вы можете просто установить переменную-член, скажем mPosition на самом адаптере, в позицию, переданную в onItemClick, а затем проверить getView, если позиция = = mSelectedPosition, чтобы решить, как установить представление. Если можно выбрать несколько элементов, возможно, вы установите переменную-член для каждого объекта, содержащегося в адаптере.

2 голосов
/ 31 марта 2012

Вам, вероятно, следует переопределить getView () в адаптере и изменить там цвет фона строки.

Пример:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView != null) {
        if (mSelectedPositions.contains(position)) {
            convertView.setBackgroundColor(Color.parseColor("#3fa9f5"));
        } else {
            convertView.setBackgroundColor(Color.parseColor("#ffffff"));
        }
    }
    return super.getView(position, convertView, parent);
}
0 голосов
/ 31 марта 2012

в onItemClick () просто используйте adapter.notifyDataChange ();также установите флаг в true;

в getView () вашего CustomAdapter используйте логический флаг, чтобы узнать, была ли выбрана строка или нет.Затем просто проверьте этот флаг и продолжайте, как хотите, т.е. if (flag) {v.setBackgroundColor (Color.parseColor ("# 80B7DBE8"));} else {v.setBackgroundColor (Color.parseColor ("# FF0000"));}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...