Android Kotlin: How to programmatically disable an item in ListView

This code demonstrates two approaches to disable items in a ListView within an Android application written in Kotlin. Disabling an item prevents the user from clicking it and performing any associated actions. The code includes a button that allows the user to manually disable an item and also showcases programmatic disabling during the list adapter initialization.

Breakdown of the Code

The code consists of two main parts: the MainActivity.kt file containing the Activity code and the activity_main.xml file defining the layout.

  • MainActivity.kt:
    • This file defines the MainActivity class which extends the Activity class.
    • It retrieves references to the UI elements (Button, ListView, TextView) from the layout using findViewById.
    • It creates a list of color names to populate the ListView.
    • An ArrayAdapter is initialized with the list data. This adapter provides a bridge between the data and the ListView.
      • The isEnabled method of the adapter overrides the default behavior. It returns false only for the item at position 4 (index starts from 0), effectively disabling clicks on that specific item.
      • The getView method additionally sets the text view color for the disabled item, but this doesn't actually prevent clicks.
    • The adapter is attached to the ListView.
    • An onItemClickListener is set for the ListView to capture user clicks and display the selected item in a TextView.
    • A button click listener is implemented. Clicking the button disables the button itself and then disables the third item (index 2) in the ListView by directly modifying its properties.

Summary

This code provides a comprehensive example of disabling ListView items in Kotlin. It demonstrates both programmatic control during adapter initialization and user interaction through a button click. By understanding the isEnabled method and direct view manipulation, developers can achieve different levels of item disabling functionality within their Android applications.


MainActivity.kt

package com.cfsuman.kotlintutorials

import android.app.Activity
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.*


class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get the widgets reference from XML layout
        val button = findViewById<Button>(R.id.button)
        val listView = findViewById<ListView>(R.id.listView)
        val textView = findViewById<TextView>(R.id.textView)


        // list to populate list view
        val list = mutableListOf(
            "Golden yellow",
            "Han purple",
            "Hansa yellow",
            "Jazzberry jam",
            "Jungle green",
            "Lavender blush",
            "Lawn green"
        )


        // initialize an array adapter
        val adapter:ArrayAdapter<String> = object: ArrayAdapter<String>(
            this,
            android.R.layout.simple_dropdown_item_1line,
            list
        ){
            override fun isEnabled(position: Int): Boolean {
                // disable adapter fifth item at array adapter initialization
                // this actually disable list view item click
                return position != 4
            }

            override fun getView(position: Int, convertView: View?,
                                 parent: ViewGroup): View {

                val tv =  super.getView(position,
                    convertView, parent) as TextView

                // show the disable text color for fifth item
                // this actually not disable the list view item click
                tv.isEnabled = position != 4

                return tv
            }
        }


        // attach the array adapter with list view
        listView.adapter = adapter


        // list view item click listener
        listView.onItemClickListener = AdapterView.OnItemClickListener {
                parent, view, position, id ->

            val selectedItem = parent?.getItemAtPosition(position)
                .toString()
            textView.text = selectedItem
        }


        // disable list view third item on button click
        button.setOnClickListener {
            // disable the button itself
            it.isEnabled = false

            // disable the third item of list view
            val view = listView.getChildAt(2)
            view.setOnClickListener { }
            view.isEnabled = false
        }
    }
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    android:background="#DCDCDC"
    android:padding="24dp">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Disable Third Item"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="24dp"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Select your favorite color"
        android:fontFamily="sans-serif"
        android:gravity="center"
        android:textColor="#333399"
        android:textSize="24sp"
        android:textStyle="italic"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>