RecycleView(その4)長押しクリックイベント

Android Studio

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

最初、ClickをLongClickに変更するだけで良いと思い、全部変えて見ました。ところが、

となってしまいます。Clickだと出ないに何でと思っていたら

LongClickの時はBoolernを返さないといけないのですね。

trueを返すようにすれば、動きました。

その3から変更のないlayoutのxmlも含めてコードを全て載せておきます。(後で自分が困るから)

CustomAdapter.kt

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: OnItemLongClickListener

    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.setOnLongClickListener {
            listener1.OnItemLongClickListener(it, position, prefList[position])
            return@setOnLongClickListener true
        }

    }

    //インターフェースの作成
    interface OnItemLongClickListener {
        fun OnItemLongClickListener(view: View, position: Int, clickedText: String)
    }

    // リスナー
    fun setOnItemLongClickListener(listener: OnItemLongClickListener){
        this.listener1 = listener
    }

}

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.setOnItemLongClickListener(object :CustomAdapter.OnItemLongClickListener {
            override fun OnItemLongClickListener(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)
        }
    }

}

list_layout.xml

<?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

<?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>

おまけ:ClickからLongClickに変更する途中に、一部変更していない状態で動かしていました。CustomAdapter内のonBindViewHolderのタップした時の処理のholder.itemView.setOnLongClickListener のみ下記のようにholder.itemView.setOnClickListenerのままにして動かすと普通のクリック処理で動いてました。

        // タップしたとき
        holder.itemView.setOnClickListener {
            listener1.OnItemLongClickListener(it, position, prefList[position])
            //return@setOnLongClickListener true
        }

コメント

タイトルとURLをコピーしました