Я использую ListActivity
со своим собственным классом ArrayAdapter
. Когда я переопределяю методы ArrayAdapter.areAllItemsEnabled()
и ArrayAdapter.isEnabled()
, разделитель между некоторыми ячейками в представлении списка исчезает. Кто-нибудь знает, как этого избежать? Мне нужно, чтобы разделители отображались даже для отключенных ячеек.
Исчезающий разделитель в ListView, когда ArrayAdapter.isEnabled возвращает false
Ответ 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
имеет установленный обработчик щелчка (что маловероятно, но может произойти из-за ошибки пользователя).