Как выделить элемент ListView при касании?

У меня есть простой ListView, и я хочу, чтобы каждый элемент был выделен при нажатии на пользователя. Я думал, что это должно произойти по умолчанию, но это не так. Можете ли вы посоветоваться?

ListView xml:

<ListView
    android:id="@+id/list_view"     
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:divider="#206600"
    android:dividerHeight="2dp"
    android:smoothScrollbar="true"
    android:background="#ffffff"
    >
</ListView>

И код моего адаптера:

private class MyAdapter extends ArrayAdapter<Task> {
        private LayoutInflater mInflater;

        public MyAdapter(Context context, int resource, List<Task> list) {
            super(context, resource, list);
            mInflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;

            if (v == null) {
                v = mInflater.inflate(R.layout.list_item, null);
            }

            Task task = taskList.get(position);

            /* Setup views from your layout using data in Object here */

            return v;
        }

Ответ 1

Возможно, вы захотите опубликовать свой фактический код макета строки, но я подозреваю, что проблема заключается в том, что вы задаете цвет фона в строке списка. По умолчанию селекторы рисуются за элементами списка (что выглядит лучше, так как цвет выделения находится за текстом). Либо не устанавливайте цвет фона в своих элементах списка, либо установите его вместо верхнего селектора с помощью атрибута ListView drawSelectorOnTop XML.

EDIT: если у вас действительно должен быть непрозрачный фон для состояния по умолчанию и вы не хотите использовать drawSelectorOnTop, вы также можете попробовать следующее: установить фон в строках списка, но использовать StateListDrawable для использования @android:drawable/list_selector_background для всех, кроме состояния по умолчанию (для этого вы можете определить xml файл в своей папке drawables, см. документацию StateList ).

Вы также можете разложить макет внутри внешнего фреймворка строки с фоном, установленным на @android:drawable/list_selector_background; таким образом, фон будет рисоваться поверх вашего фона, но ниже содержимого.

Ответ 2

ListView не сохраняют визуальную индикацию фокусировки (или выбора) в режиме касания. Вы увидите это только при использовании аппаратной клавиатуры или элементов управления для навигации по пользовательскому интерфейсу.

Подробнее см. в статье "Режим Touch" в блоге Android.

Итак, если вы используете только сенсорный режим, вы никогда не увидите фокус или выбор на ListView s.

Ответ 3

Я считаю, что это связано с атрибутом "Включено" элементов в ListAdapter.

Если ваш адаптер содержит код:

@Override
public boolean areAllItemsEnabled() {
    return true;
}

Затем каждый элемент должен быть кликабельным (и поэтому должен подчеркнуть, что он был затронут).

Не могли бы вы сообщить подробности (и, возможно, код) того, какой адаптер вы используете для этого списка?

Ответ 4

Я боролся с этим в течение нескольких дней. В конце концов, я должен создать виджет, который поддерживает интерфейс Checkable и вернуть этот виджет/представление в моей адаптера getiew(). И listview должен находиться в ListView.CHOICE_MODE_SINGLE (или, возможно, в любом другом режиме, указанном android:choiceMode), чтобы отслеживать выбор, сделанный в пользовательском интерфейсе.

Таким образом, по существу, необходимо, чтобы все элементы списка были выделены следующим образом:

  • ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  • ListAdapter.getView() вернуть представление, реализующее интерфейс Checkable
  • ListView.OnItemClickListener должен вызывать setItemChecked(position, true) для отметки проверяемого элемента (и, таким образом, выделить его в списке)

Надеюсь, это поможет кому-то, кто также борется с этим.