Исчезающий разделитель в ListView, когда ArrayAdapter.isEnabled возвращает false - PullRequest
32 голосов
/ 21 марта 2011

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

Ответы [ 10 ]

57 голосов
/ 31 марта 2011

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

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

13 голосов
/ 22 января 2015

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

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 голосов
/ 31 марта 2016

Это сработало для меня. Это покажет разделитель, а также отключить щелчок по элементу списка. Даже в 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" необходимо здесь

2 голосов
/ 07 августа 2015

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

2 голосов
/ 05 августа 2015

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

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

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

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

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

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

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

См. User622689 ответ.

2 голосов
/ 30 марта 2015

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

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

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

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

convertView.setBackgroundResource(R.drawable.border_b1px_black);
1 голос
/ 17 июня 2011

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

0 голосов
/ 25 февраля 2016

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

    <ListView
         android:id="@+id/listView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:dividerHeight="1dp"
    />
0 голосов
/ 03 июля 2015

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

 android:background="@android:color/transparent"
0 голосов
/ 21 марта 2011

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

...