[Android/Kotlin]RecyclerView itemをクリックして画面を切り替えます
アダプタが実装されていると仮定します.
NoticeAdapter
NoticeDTO
NoticeDetailActivity(アイテムをクリックしたときに表示するアクティビティ)
モジュール単位で構築します.gradleファイルを開き、pluginsとandroidに次の行を追加します.
アダプタは、ViewHolderに数行追加するだけです.
🤔#1
クリックすると、Intentを使用して再生するアクティブなテレビに情報を転送します.contextをintentのパラメータとして必要としますが、アダプタはどのようにcontextを使用しますか?
→すべてのビューにcontextが含まれているので使用できます.
🤔#2
intentでダンプ可能なデータの基本タイプは、次のように限定されます. Data DTO、つまり私たちがランダムに作成したデータクラス形式のデータを渡すには、どうすればいいですか?
→シリアル化を使用します.これは、Serializable、Parcelize、Parcelizeの3つの方法で実現できます.シリアル化は簡単ですが、速度は非常に遅いです. Parcelableはそれより速いですが、必要なコードは開発者が実現するので、簡単な値では書く必要があるコードが多すぎます. Parcelizeは、シリアル化の簡便性と並列性を兼ね備えた方法です.君に決まったよ~!
activity_notice_detail.xml
リファレンス
整理する
Tistory | yoo.dev
Tistory|開発ログ
👆 準備物
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つの方法で実現できます.
📂 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|開発ログ
Reference
この問題について([Android/Kotlin]RecyclerView itemをクリックして画面を切り替えます), 我々は、より多くの情報をここで見つけました https://velog.io/@hygge/Android-Kotlin-RecyclerView-item-클릭-시-화면-전환テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol