【Android 入門開發實戰:口罩地圖】RecyclerView 基本資料列表顯示

 

【Android 入門開發實戰:口罩地圖】線上免費講義課程目錄

當我們要顯示大量多筆項目資料的時候,普遍都是使用 RecyclerView 列表元件,RecyclerView 是傳統 ListView 改善版,除了提高效能,使用上也更加便利與靈活。這一節課程,我們將來介紹,如何使用 RecyclerView 列表元件。

添加 RecyclerView 依賴庫 (dependencies)

在 GRADLE (Module) 層級 dependencies 內加入:

implementation 'androidx.recyclerview:recyclerview:1.1.0'

自定義 MainAdapter

MainAdapter.kt

package com.thishkt.pharmacydemo

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.thishkt.pharmacydemo.data.Feature
import com.thishkt.pharmacydemo.databinding.ItemViewBinding


class MainAdapter :
    RecyclerView.Adapter<MainAdapter.MyViewHolder>() {

    var pharmacyList: List<Feature> = emptyList()
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val itemViewBinding =
            ItemViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return MyViewHolder(itemViewBinding)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.itemViewBinding.tvName.text = pharmacyList[position].property.name
    }

    override fun getItemCount(): Int {
        return pharmacyList.size
    }

    class MyViewHolder(val itemViewBinding: ItemViewBinding) :
        RecyclerView.ViewHolder(itemViewBinding.root)

}

項目佈局

layout/item_view.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="wrap_content">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="TextView"
        android:textColor="#424242"
        android:textSize="30dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

將 RecyclerView 元件添加到佈局中

activity_main.xml 內,移除之前課程介紹的 TextView、ScrollView 元件,加入 RecyclerView 元件。

...
...
...
 <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
...
...
...

設定 RecyclerView

MainActivity.kt,設定 RecyclerView 的 manager 和 adapter

class MainActivity : AppCompatActivity() {

//定義全域變數
private lateinit var viewAdapter: MainAdapter
private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var binding: ActivityMainBinding


...
...
...

 private fun initView() {
        // 定義 LayoutManager 為 LinearLayoutManager
        viewManager = LinearLayoutManager(this)

        // 自定義 Adapte 為 MainAdapter,稍後再定義 MainAdapter 這個類別
        viewAdapter = MainAdapter()

        // 定義從佈局當中,拿到 recycler_view 元件,
        binding.recyclerView.apply {
            // 透過 kotlin 的 apply 語法糖,設定 LayoutManager 和 Adapter
            layoutManager = viewManager
            adapter = viewAdapter
        }
    }
...
...
...

private fun getPharmacyData() {
...
        runOnUiThread {
            //將下載的口罩資料,指定給 MainAdapter
            viewAdapter.pharmacyList = pharmacyInfo.features

            //關閉忙碌圈圈
            binding.progressBar.visibility = View.GONE
        }
}

...
...
...

輸出結果

RecyleView 更多設定

設定項目固定寬度、高度

設定每個項目寬度、高度固定,可以提高效能,不用每條項目,都要讓系統重新去計算 size。

setHasFixedSize(true)

設定項目分隔線 (divider)

每個項目,加入分隔線,讓每筆資料看起來更清楚

 recycler_view.apply {
 ...
 ...
 ...
    addItemDecoration(
        DividerItemDecoration(
            this@MainActivity,
            DividerItemDecoration.VERTICAL
        )
    )
}

輸出結果

點擊漣漪效果(Ripple Effect)

若想要點擊每個項目,出漣漪波紋效果,需要在項目佈局裡設定背景

android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"

輸出結果

RecyclerView 官方介紹與使用教學

Create a List with RecyclerView
https://developer.android.com/guide/topics/ui/layout/recyclerview

RecyclerView Reference
https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView

參考資料

Create a List with RecyclerView
https://developer.android.com/guide/topics/ui/layout/recyclerview

RecyclerView Reference
https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView

Android RecyclerView Sample (Kotlin)
https://github.com/android/views-widgets-samples/tree/master/RecyclerViewKotlin

程式碼範例

範例名稱:RecyclerView_基本資料列表顯示
開發人員:HKT (侯光燦)
程式語言:Kotlin
開發環境:Android Studio 4.1.1 & Android 11 & Kotlin 1.4.21
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載

這個網誌中的熱門文章

16天記下7000單字

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

nano 文字編輯器

【從零開始學 Flutter 程式設計】SharedPreferences 設定檔資料存取