Android List Topics - YamamotoDesu/Yamamoto-Notes GitHub Wiki

List Basic

1. Remove a List Data(layout.simple_list_item_1)

activity_main.xml

    <ListView
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

MainActivity.kt

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

        val data = mutableListOf("胡椒", "ターメリック", "コリアンダー", "生姜", "ニンニク", "サフラン")

         var adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            data
        )

        val list = findViewById<ListView>(R.id.list)
        list.adapter = adapter

        list.setOnItemClickListener { av, view, position, id ->
            adapter.remove((view as TextView).text as String)
        }
    }

2. choiceMode="multipleChoice"(simple_list_item_multiple_choice)

activity_main.xml

    <ListView
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:choiceMode="multipleChoice"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

MainActivity.kt

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

        val data = arrayOf("胡椒", "ターメリック", "コリアンダー", "生姜", "ニンニク", "サフラン")

        var adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_multiple_choice,
            data
        )


        val list = findViewById<ListView>(R.id.list)
        list.adapter = adapter

     }
}

3. choiceMode="multipleChoiceModal"(simple_list_item_checked)

activity_main.xml

    <ListView
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:choiceMode="multipleChoiceModal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

MainActivity.kt

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

        val data = arrayOf("胡椒", "ターメリック", "コリアンダー", "生姜", "ニンニク", "サフラン")
        var adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_checked,
            data
        )

        val list = findViewById<ListView>(R.id.list)
        list.adapter = adapter

        list.setMultiChoiceModeListener(object : AbsListView.MultiChoiceModeListener {

            // アクションモードを起動する時
            override fun onCreateActionMode(p0: ActionMode?, p1: Menu?): Boolean {
               return true
            }

            // アクションモードの準備時
            override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
               return true
            }

            //選択項目のチェック状態が変化した時
            override fun onItemCheckedStateChanged(
                p0: ActionMode?,
                p1: Int,
                p2: Long,
                p3: Boolean
            ) {

            }

            //項目をクリック
            override fun onActionItemClicked(p0: ActionMode?, p1: MenuItem?): Boolean {
                return true
            }

            override fun onDestroyActionMode(p0: ActionMode?) {
                val msg = mutableListOf<CharSequence>()
                list.forEach {
                    val check = it as CheckedTextView
                    if (check.isChecked) msg.add(check.text)
                }
                Toast.makeText(
                    this@MainActivity,
                    "選択したのは、${msg.joinToString()}",
                    Toast.LENGTH_SHORT
                ).show()
            }
        })
}

5. setOnScrollListener

        var adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            data
        )


        val list = findViewById<ListView>(R.id.list)
        list.adapter = adapter

        list.setOnScrollListener(
            object : AbsListView.OnScrollListener {
                override fun onScroll(av: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {
                    if (firstVisibleItem + visibleItemCount + 3 > totalItemCount) {
                        adapter.add("新 胡椒")
                        adapter.add("新 ターメリック")
                        adapter.add("新 コリアンダー")
                    }
                }

                override fun onScrollStateChanged(p0: AbsListView?, p1: Int) {

                }
            }
        )

5. SearchView

    <!--検索ボックス追加-->
    <SearchView
        android:id="@+id/search"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false"
        android:queryHint="検索文字列を入力"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        >
    </SearchView>

    <ListView
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/search"
        />
        var adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            data
        )

        val list = findViewById<ListView>(R.id.list)
        list.adapter = adapter

        // フィルター機能を有効化
        list.isTextFilterEnabled = true

        // 検索ボックスに入力された時の処理を定義
        val sv = findViewById<SearchView>(R.id.search)
        sv.setOnQueryTextListener(
            object : SearchView.OnQueryTextListener {
                override fun onQueryTextSubmit(text: String?): Boolean {
                    if (text.isNullOrBlank()) {
                        list.clearTextFilter()
                    } else {
                        list.setFilterText(text)
                    }
                    return false
                }

                override fun onQueryTextChange(p0: String?): Boolean {
                    return false
                }
            }
        )

6. SimpleAdapter

activity_main/xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="25sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="@+id/title"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/desc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="15sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

        val data = listOf(
            mapOf("title" to "革命のエチュード", "tag" to "ピアノ", "desc" to "ピアノの詩人と言われたショパンの代表的なピアノです。"),
            mapOf("title" to "G線上のアリア", "tag" to "バイオリン", "desc" to "バッハの作品。バイオリンのG線のみで演出できること..."),
            mapOf("title" to "シャコンヌ", "tag" to "チェロ", "desc" to "バッハの作品。パルティータ第2番の終曲です。"),
            mapOf("title" to "夜の女王のアリア", "tag" to "声楽", "desc" to "モーツァルト作品のオペラ「魔笛」の中のアリアです")
        )

        val list = findViewById<ListView>(R.id.list)
        list.adapter = SimpleAdapter(
            this,
            data,
            R.layout.list_item,
            arrayOf("title", "tag", "desc"),
            intArrayOf(R.id.title, R.id.tag, R.id.desc)
        )

7. Custom Adapter

ListItem.kt

data class ListItem(
    val id: Long,
    val title: String,
    val tag: String,
    val desc: String
)

MyListAdapter.kt

class MyListAdapter (
    private val context: Context,
    private val data: List<ListItem>,
    private val resource: Int
    )
    : BaseAdapter() {

    private val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    override fun getCount(): Int {
        return data.size
    }

    override fun getItem(position: Int): ListItem {
        return data[position]
    }

    override fun getItemId(position: Int): Long {
        return data[position].id
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val item = getItem(position)
        val sview = convertView ?: inflater.inflate(resource, null)
        sview.findViewById<TextView>(R.id.title).text = item.title
        sview.findViewById<TextView>(R.id.tag).text = item.tag
        sview.findViewById<TextView>(R.id.desc).text = item.desc
        return sview
    }

MainActivity.kt

        val data = listOf(
            ListItem( 1, "革命のエチュード",  "ピアノ",  "ピアノの詩人と言われたショパンの代表的なピアノです。"),
            ListItem( 2, "G線上のアリア",  "バイオリン",  "バッハの作品。バイオリンのG線のみで演出できること..."),
            ListItem( 3, "シャコンヌ",  "チェロ",  "バッハの作品。パルティータ第2番の終曲です。"),
            ListItem( 4, "夜の女王のアリア",  "声楽",  "モーツァルト作品のオペラ「魔笛」の中のアリアです."),
        )

        val list = findViewById<ListView>(R.id.list)
        list.adapter = MyListAdapter(this, data, R.layout.list_item)

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="25sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="@+id/title"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/desc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="15sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title"
        />

</androidx.constraintlayout.widget.ConstraintLayout>
⚠️ **GitHub.com Fallback** ⚠️