Disappearing divider in ListView when ArrayAdapter.isEnabled returns false

I'm using ListActivity with my own ArrayAdapter class. When I override the methods ArrayAdapter.areAllItemsEnabled() and ArrayAdapter.isEnabled() the divider between some cells in the list view disappear. Does anyone know how to avoid this? I need the dividers to display even for disabled cells.


Solution 1:

Return true in areAllItemsEnabled() and false in isEnabled for specific item. The disabled item wont be clickable but you will still be able to view the divider lines

Note: This doesn't work for Android 5

Solution 2:

You can essentially disable a list item by giving any one of its elements the following properties.

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

So the following list item layout will not be clickable, but will show dividers, without the need to implement areAllItemsEnabled() or 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>

This may help in Android 5.0 where the original answer no longer seems to work.

Solution 3:

This worked for me. This will show the divider as well as disable the click on list item. Even in Android 5.0.

Set this on the list item

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

Setting just clickable to 'false' didn't work for me. And Overriding isEnabled() caused the above mentioned issue of hiding the divider in 5.0.

And my ListView looks like this.

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

No android:listSelector="@android:color/transparent" needed here