[Android/Kotlin]RecyclerView itemをクリックして画面を切り替えます


アダプタが実装されていると仮定します.

👆 準備物


NoticeAdapter
NoticeDTO
NoticeDetailActivity(アイテムをクリックしたときに表示するアクティビティ)

🔨 build.grade依存性の追加


モジュール単位で構築します.gradleファイルを開き、pluginsとandroidに次の行を追加します.
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}
android {
    androidExtensions {
        experimental true
    }
}
後で説明しますが、これはParcelizeを使用するために追加された部分です.

📂 NoticeAdapter.kt


アダプタは、ViewHolderに数行追加するだけです.
inner class NoticeViewHolder(val binding: ItemNoticeBinding): RecyclerView.ViewHolder(binding.root) {
    fun bind(item: NoticeDTO) {
        binding.notice = item
}
↑簡単なソースコード
inner class NoticeViewHolder(val binding: ItemNoticeBinding): RecyclerView.ViewHolder(binding.root) {
    private val context = binding.root.context

    fun bind(item: NoticeDTO) {
        binding.notice = item
        itemView.setOnClickListener {
            val intent = Intent(context, NoticeDetailActivity::class.java)
            intent.putExtra("data", item);
            intent.run { context.startActivity(this) }
        }
    }
}
↑クリック率を上げるコード
🤔#1
クリックすると、Intentを使用して再生するアクティブなテレビに情報を転送します.contextをintentのパラメータとして必要としますが、アダプタはどのようにcontextを使用しますか?
→すべてのビューにcontextが含まれているので使用できます.private val context = binding.root.contextそう!
🤔#2
intentでダンプ可能なデータの基本タイプは、次のように限定されます. Data DTO、つまり私たちがランダムに作成したデータクラス形式のデータを渡すには、どうすればいいですか?
→シリアル化を使用します.これは、Serializable、Parcelize、Parcelizeの3つの方法で実現できます.
  • シリアル化は簡単ですが、速度は非常に遅いです.
  • Parcelableはそれより速いですが、必要なコードは開発者が実現するので、簡単な値では書く必要があるコードが多すぎます.
  • Parcelizeは、シリアル化の簡便性と並列性を兼ね備えた方法です.君に決まったよ~!
  • 📂 NoticeDTO

    @Parcelize
    data class NoticeDTO(
        @SerializedName("category") val category: String,
        @SerializedName("title") val title: String
    ) : Parcelable
    Parcelableを適用!dataクラスの既存コードに@Parcelizeおよび : Parcelableを追加します.

    📂 NoticeDetailActivity

    class NoticeDetailActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityNoticeDetailBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            binding = ActivityNoticeDetailBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            val data = intent.getParcelableExtra<NoticeDTO>("data")
            
            binding.detailCategory.text = data!!.category
            binding.detailTitle.text = data!!.title
    
        }
    }
    itemをクリックすると再生するActivity.データはintent.getParcelableExtra<NoticeDTO>("data")に転送され、TextViewに適用される.
    activity_notice_detail.xml
    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".activity.NoticeDetailActivity"
            android:padding="20dp">
    
            <TextView
                android:id="@+id/detail_category"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
            <TextView
                android:id="@+id/detail_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/detail_category" />
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    </layout>
    オフ~!
    リファレンス
    整理する
    Tistory | yoo.dev
    Tistory|開発ログ