Подтвердить что ты не робот

Исчезающий разделитель в ListView, когда ArrayAdapter.isEnabled возвращает false

Я использую ListActivity со своим собственным классом ArrayAdapter. Когда я переопределяю методы ArrayAdapter.areAllItemsEnabled() и ArrayAdapter.isEnabled(), разделитель между некоторыми ячейками в представлении списка исчезает. Кто-нибудь знает, как этого избежать? Мне нужно, чтобы разделители отображались даже для отключенных ячеек.

4b9b3361

Ответ 1

Возвращает true в isAllItemsEnabled() и false в isEnabled для определенного элемента. Отключенный элемент не будет доступен для кликов, но вы все равно сможете просматривать разделительные линии

Примечание. Это не работает для Android 5

Ответ 2

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

android:focusable="true"
android:clickable="true"

Таким образом, следующий макет элемента списка не будет доступен для кликабельности, но отобразит разделители без необходимости реализации areAllItemsEnabled() или isEnabled(int position).

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:focusable="true"
    android:clickable="true">
    <TextView
        android:text="Large Text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

Это может помочь в Android 5.0, где исходный ответ больше не работает.

Ответ 3

Это сработало для меня. Это покажет разделитель, а также отключит щелчок по элементу списка. Даже в Android 5.0.

Установите это в элементе списка

android:focusable="true"
android:clickable="false"

Настройка только кликабела на "ложь" не помогла мне. И Overriding isEnabled() вызвало вышеупомянутую проблему спрятать разделитель в 5.0.

И мой ListView выглядит так.

<ListView
    android:id="@+id/lvItems"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@color/Gray"
    android:dividerHeight="1px">
</ListView>

Нет android:listSelector="@android:color/transparent" здесь

Ответ 4

У всех вышеперечисленных решений есть проблема с совместимостью (хорошо работает на одной версии Android, но не работает на других) - особенно если вы хотите использовать прозрачность. Единственное действительно надежное решение - использовать файл с девятью патчами.

Вы можете скачать с: http://ge.tt/517ZIFC2/v/1?c

Поместите выбранный png в каталог drawable-nodpi, чтобы избежать повторной выборки.

И используйте его в своем адаптере:

convertView.setBackgroundResource(R.drawable.border_b1px_black);

Ответ 5

Вам нужно будет включить строки в методе isEnabled() для Android 5.0 и выше.

Но вы все равно можете отключить строки другим способом:

В следующем примере я отключу каждую строку, но строку 0:

В вашем методе getView для вашего адаптера:

if (position > 0) {
        convertView.setClickable(true);
}

По какой-либо причине установка clickable в true отключает строку. Я не знаю, почему. Сначала я предположил, что это сделает его кликабельным, но это не так.

Ссылка: Android ListView child View setEnabled() и setClickable() ничего не делают

См. ответ пользователя622689.

Ответ 6

Вместо установки isEnabled на ListView установите android:listSelector="@android:color/transparent" а также android:focusable="true" и android:clickable="true". Он дает тот же эффект

Ответ 7

Я могу проверить, что когда areAllItemsEnabled() возвращает false, то для каждой конкретной строки, которую вы хотите установить как не подлежащую выбору через isEnabled(int position), разделитель строк (разделитель) исчезает. Установка areAllItemsEnabled() всегда возвращает true, а воспроизведение только с помощью isEnabled(int position) должно делать определенные строки неизбираемыми, при этом делитель показывает только штраф.

Ответ 8

использовать setDivider(Drawable divider) метод listview

Ответ 9

У меня была такая же проблема на Lollipop. Обходным решением для меня было изменение фона в списке на прозрачное. В моем случае мне не хватало разделителей на ящике nav в строках, где isEnabled возвращает false, когда я устанавливаю фон в цвет. Попробуйте что-то вроде:

 android:background="@android:color/transparent"

Ответ 10

У меня была аналогичная проблема. Я решил это, явно установив высоту разделителя в виде списка "1dp"

    <ListView
         android:id="@+id/listView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:dividerHeight="1dp"
    />

Ответ 11

Чтобы на самом деле эмулировать отключенный элемент, в getView адаптера, где layout = (your return value):

        if (YOUR_ITEM_REF?.isEnabled()) {
            layout.setClickable(true);
            layout.setAlpha(0.5f);
        } else {
            layout.setClickable(false);
            layout.setAlpha(1f);
        }

Это 100% работает так, как вы думаете, просто отключив элемент и пометив его как отключенный с помощью простого альфа-фильтра, чтобы получить эффект "Spectre".

Где YOUR_ITEM_REF - это ваш объект (элемент) в списке, а не адаптер или список, а фактический элемент.

Ваш адаптер должен вернуть значение true для allItemsEnabled и isEnabled, чтобы отключить обработку неработающей функции по умолчанию.

Вот как я исправил свою проблему, используя ответ, заданный Sandy D.. Это не работает, если ваш layout имеет установленный обработчик щелчка (что маловероятно, но может произойти из-за ошибки пользователя).