【Android 入門開發實戰:口罩地圖】RecyclerView 跳頁&資料傳遞(1)

 

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

項目設定id值

    ...
    ...
    ...
  <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout_item"
      ...
      >
    ...
    ...
    ...

新建空白 Activity

在目錄上按右鍵點選,選擇「New」->「Activity」->「Empty Activity」,檔名為:PharmacyDetailActivity。

加入 CallBack 介面

在 MainAdapter.kt,定義 CallBack 介面

 interface IItemClickListener {
        fun onItemClickListener(data: Feature)
    }

然後繼續在 MainAdapter.kt,卡片 UI 上加入監聽點擊事件,並在事件中加入CallBack 回傳當下項目資料。

...
...
...

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
...
...
...

 holder.itemViewBinding.layoutItem.setOnClickListener {
            itemClickListener.onItemClickListener(pharmacyList[position])
        }
}

...
...
...

接著 MainAdapter 加入 CallBack 參數

class MainAdapter(private val itemClickListener: IItemClickListener) :
   ... {
...
...
...
    }

所以 MainActivity 會去實作這個 CallBack,並在收到回呼時執行跳頁並傳遞該筆藥局資料。

class MainActivity : AppCompatActivity(), MainAdapter.IItemClickListener {
...
...
...
viewAdapter = MainAdapter(this)
...
...
...
 override fun onItemClickListener(data: Feature) {
        val intent = Intent(this, PharmacyDetailActivity::class.java)
        intent.putExtra("data",data)
        startActivity(intent)
    }
}

這時 data 會報錯,所以我們需要將要傳遞過的資料類別 PharmacyInfo.kt,宣告為序列化(Serializable)即可。

data class PharmacyInfo(
    ...
):Serializable

data class Feature(
    ...
):Serializable

data class Geometry(
    ...
):Serializable

data class Properties(
    ...
):Serializable

PharmacyDetailActivity.kt

//獲取
private val data by lazy { intent.getSerializableExtra("data") as Feature }
...
...
...
//印出資料
Log.d("HKT", "藥局名稱:${data.property.name}")

輸出結果

看點到哪一張卡片,就會印出該張藥局的名稱

藥局名稱:黃藥局

萬惡錯誤 NullPointerException

但假設資料,沒有正確傳遞過來,將會引起 Caused by: java.lang.NullPointerException 造成 APP 不可預期閃退,所以需要再修改一下,確保資料為空時,仍可以正常顯示。

private val data by lazy { intent.getSerializableExtra("data") as? Feature }
...
...
...
val name = data?.property?.name
Log.d("HKT", "藥局名稱:${name ?: "資料錯誤"}")

其中 「as Feature」,是指強行將資料轉換成 Feature。「as? Feature」,as 後面多一個問號,是確保資料不為空才進行轉換。

程式碼範例

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