【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
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載