Day 16:RecyclerView 跳页&资料传递(1)

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 UdemyYoutube 频道。另外,想追踪更多相关技术资讯,欢迎到 脸书粉丝专页 按赞追踪喔~

程序码范例

范例名称:基本跳页和资料传递
开发人员:HKT (侯光灿)
程序语言:Kotlin
开发环境:Android Studio 4.1.2 & Android 11 & Kotlin 1.4.21
授权范围:使用时必须注明出处且不得为商业目的之使用
范例下载点:点我下载

今天我们将要来学习,如何建立当点击列表中的项目事件时,将资料传递到下一页「药局详细资讯页」。

列表项目设定id值

当点我们想要操作 UI 元件,我们需要将此元件设定 id 值,如此一来,我们等一下就可以透过这个 id 来控制处理此 UI 元件。

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

新建空白 Activity

在专案总管上,按右键点选,选择「New」->「Activity」->「Empty Activity」,档名为:PharmacyDetailActivity。此 Activity 页面,将设定为「药局详细资讯页」。

加入 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,并在收到回呼时,透过 Intent 执行跳页并传递该笔药局资料,到下一页,药局详细资讯页。

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 ,今天「药局详细资讯页」,我们只是先简单,去接收解析前一页,传递过来的资料,当收到时,使用 Log 方式,在 IDE 下方的 Loacat 输出资讯视窗,即可以看到印出该间药局名称。

//获取
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 线上教室
https://tw-hkt.blogspot.com/

Freepik
https://www.freepik.com/


那今天【iThome 铁人赛】就介绍到这边罗~

顺带一提,KT 线上教室,脸书粉丝团,会不定期发布相关资讯,不想错过最新资讯,不要忘记来按赞,追踪喔!也欢迎大家将这篇文章分享给更多人喔。

我们明天再见罗!!!掰掰~


<<:  Day 01 Flask 是什麽

>>:  Day 1 Odoo是什麽呢? 云端ERP?

JavaScript Day 29. 立即函式 IIFE

立即函式,也称 Immediately Invoked Function Expression,简称...

30天零负担轻松学会制作APP介面及设计【DAY 15】

大家好,我是YIYI,今天我要来制作日记-LIST以及个人资料页面。 日记LIST 日记LIST是在...

【Day 6】Replication

决定要拆章节了, 这篇只有 5.1, 5.2 5.3 放明天,因为我好累。 这章会提到 replic...

Day.30 「什麽!? Promise 的语法糖?」 —— ES8 Async & Await

ES8 新增了 async 与 await 两个语法,这两个语法也是为了更方便解决非同步的语法,可...

用自己方式存在的工程师 - TonyQ [下]

Bernard:很多人可能知道,你其实没有传统的学历。台湾企业对於这种非传统背景的求职者,算是友善吗...