RecyclerView(その3)クリックイベントの備忘録です。RecyclerViewのcellをクリックしたらTextViewにcellの内容を表示するだけのものです。
注意:こうやったら動きましたと言う例で、本当に正しいやり方かどうかはわかりません。
環境は以下の通りです。
Android Studio Dolphin | 2021.3.1
Build #AI-213.7172.25.2113.9014738, built on September 1, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 13.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 8
Adapter(CustomAdapter.kt)にlistenerとinterfaceを追加します。
package com.gmail.san58gong.myrecycleview01
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class CustomAdapter(private val prefList: ArrayList<String>): RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
// リスナー格納変数
lateinit var listener1: OnItemClickListener
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val text1: TextView
init {
text1 = view.findViewById(R.id.textView)
}
}
override fun getItemCount(): Int = prefList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_layout, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.text1.text = prefList[position]
// タップしたとき
holder.itemView.setOnClickListener {
listener1.onItemClickListener( it, position, prefList[position])
}
}
//インターフェースの作成
interface OnItemClickListener {
fun onItemClickListener(view: View, position: Int, clickedText: String)
}
// リスナー
fun setOnItemClickListener(listener: OnItemClickListener){
this.listener1 = listener
}
}
cellのlayout(list_layout.xml)はその1から変更なしです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
</LinearLayout>
activity_main.xmlは選択したcellの内容を表示するTextViewを追加しました。
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="409dp"
android:layout_height="729dp"
android:layout_marginTop="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="2dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
“MainActivity.kt”にはクリックされた時の処理を追加しています。
package com.gmail.san58gong.myrecycleview01
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import java.io.BufferedReader
import java.io.FileReader
import java.io.IOException
import java.io.InputStreamReader
class MainActivity : AppCompatActivity() {
lateinit var mAdapter: CustomAdapter
var listArray = emptyList<String>()
var csvFile: String? = "list.csv" //csvファイル名
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val text2 = findViewById<TextView>(R.id.textView2)
// RecyclerViewの取得
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
// LayoutManagerの設定
recyclerView.layoutManager = LinearLayoutManager(this)
//テキストファイルの読み込み
readCsv(csvFile!!)
// CustomAdapterの生成と設定
mAdapter = CustomAdapter(listArray as ArrayList<String>)
recyclerView.adapter = mAdapter
mAdapter.setOnItemClickListener(object :CustomAdapter.OnItemClickListener {
override fun onItemClickListener(view: View, position: Int, clickedText: String) {
text2.text = clickedText
}
})
}
fun readCsv(filename: String){
try {
val file = resources.assets.open(filename)
val fileReader = BufferedReader(InputStreamReader(file))
var rd = fileReader.readLine()
while (rd != null) {
listArray += rd
rd = fileReader.readLine()
}
}catch (e: IOException) {
//例外処理
print(e)
}
}
}
CustomAdapterを変数化して処理しています(黄色のマーカ部分)。直接下記のようにするとクラッシュしました。
recyclerView.adapter = CustomAdapter(listArray as ArrayList<String>)
CustomAdapter(listArray as ArrayList<String>).setOnItemClickListener(object :CustomAdapter.OnItemClickListener {
override fun onItemClickListener(view: View, position: Int, clickedText: String) {
text2.text = clickedText
}
})
コメント