บทเรียนต่อยอด RecyclerView บน Android ด้วย Kotlin กับการทำ itemClickListener บน Viewholder ให้เปลี่ยนหน้า Intent และส่งค่า
จากบทเรียนเดิม เขียนแอพฯ Android ด้วย Kotlin การใช้ RecyclerView และ Array
เราจะมาทำให้แอพพลิเคชันก่อนหน้าของเราที่เป็นเมนูอาหารนั้น แตะรายการแล้วเปลี่ยนหน้าได้:
สร้างหน้า Empty Activity ใหม่ขึ้นมาโดยคลิกขวาที่ apps->New->Activity->Empty Activity แล้วตั้งชื่อว่า InformationActivity
แก้ไข Layout ส่วนของ XML ไฟล์ activity_information.xml ดังนี้:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".InformationActivity"> <ImageView android:layout_width="400dp" android:layout_height="180dp" android:id="@+id/imageView" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" android:layout_marginTop="36dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.498" android:scaleType="centerCrop" app:srcCompat="@drawable/image1"/> <TextView android:text="TextView" android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/textView" android:layout_marginTop="28dp" app:layout_constraintTop_toBottomOf="@+id/imageView" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="20dp"/> </android.support.constraint.ConstraintLayout>
ซึ่ง Layout นี้จะมี TextView กับ ID ชื่อ textview และ ImageView ที่มี ID ชื่อ imageView
กลับไปที่ไฟล์ MyAdapter.kt กลับไปแก้ไขฟังก์ชัน onBindViewHolder() เราจะแทรกคำสั่ง setOnClicklistener() เข้าไปและเรียกใช้ Intent โดยอ้าง Context หน้านั้นๆ ได้โดยตรงพร้อมระบุ array position ไปยังหน้าปลายทางได้
override fun onBindViewHolder(p0: ViewHolder, p1: Int) { p0?.getNameTxt?.text = items.get(p1) p0?.getThumbnail?.setImageResource(imageId.get(p1)) p0?.itemView.setOnClickListener { Toast.makeText(context, "Click: "+items.get(p1), Toast.LENGTH_LONG).show() var intent = Intent(context, InformationActivity::class.java) intent.putExtra("TITLE",""+ items.get(p1)) intent.putExtra("IMAGE",imageId.get(p1)) context.startActivity(intent) } }
สังเกตจะเห็นว่า IMAGE เป็น parameter ที่ส่งค่า Int ไม่ใช้ String
กลับไปที่หน้า InformationActivity.kt แก้ไข Class ของมันให้เป็นแบบนี้:
package com.daydev.iapplication import android.content.Intent import android.content.Intent.getIntent import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.widget.ImageView import android.widget.TextView class InformationActivity : AppCompatActivity() { var textView: TextView? = null var imageView: ImageView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_information) textView = findViewById(R.id.textView) as TextView imageView = findViewById(R.id.imageView) as ImageView var intent = getIntent() textView!!.setText(""+intent.getStringExtra("TITLE")) imageView!!.setImageResource(intent.getIntExtra("IMAGE",0)) } }
ทดสอบแตะที่รายการอาหารดู เพื่อสังเกตข้อมูลการเปลี่ยนหน้า: