〈kotlin〉Android studio使い方メモ10:RecyclerView

金宏和實さんの「作ればわかる!Androidプログラミング kotlin対応」を参考に
Android studioでkotlinを使ってAndroidアプリ作成。

データを一覧表示するのに使用するRecyclerViewの使い方をまとめてみる。

RecyclerViewとは

データの一覧表示に使用する。
1データ分のレイアウトを設定して、それをリサイクルして使い回すことで、
大きなデータセットをスクロール表示することができる。

サブクラス
クラス名 概要
LayoutManager viewのレイアウトを決める
Adapter データとviewを関連づける
ViewHolder 1データ分の参照を保持する
RecyclerViewの配置

RecyclerViewを利用するにはサポートライブラリを追加する。

build.gradle(Module)

dependencies {
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
}

一覧表示までの流れ

レイアウトの作成

1つのデータを表示するためのレイアウトファイルを作成する。
今回データモデルとしてstring型の変数textを1つ持つクラスを定義。

class Data() {
    var text:String = ""
}

layoutディレクトリに新たにLayout Resource fileをone_result.xmlという名前で作成し、
1件分のデータを入れるためのTextViewなどを配置する。

<TextView
        android:id="@+id/dataText"
        //省略
/>
ViewHolderを継承するクラスの作成

RecyclerView.ViewHolderクラスを継承したクラスを新しく作成し、
ViewHolderのプロパティとレイアウト(one_result.xml)のviewを対応させる。

ViewHolder.kt

class ViewHolder(itemview: View): RecyclerView.ViewHolder(itemview){

    var dataText:TextView? = null

    init{
        dateText = itemview.findViewById(R.id.dateText)
    }
   //initに初期化処理を指定できる、クラス生成時にやりたいことはこの中に書く
}
Adapterを継承するクラスを作成

RecyclerView.Adapterクラスを継承したクラスを新しく作成し、
1つのデータをviewに設定する。
RecyclerView.Adapterクラスは抽象メソッドを持つ抽象クラスであるため、
以下の抽象メソッドをオーバーライドする必要がある。

抽象メソッド 概要
onCreateViewHolder() レイアウトマネージャーによって起動され、新しいviewを作成する
onBindViewHolder() レイアウトマネージャーによって起動され、作成したview上に値を設定する
getItemCount() データセットのサイズを返す

抽象メソッド:メソッド名だけが定義された中身のないメソッド (引数・返り値だけ決まっている)。
       サブクラスに共通して実装するメソッドを指示することができる。

CustomRecyclerViewAdapter.kt

class CustomRecyclerViewAdapter(list : MutableList<Data>) :
RecyclerView.Adapter<ViewHolder>() {

    private val dataList:  MutableList<Data> = list

    override fun onCreateViewHolder(parent: ViewGroup, position: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.one_result, parent, false)
        //parentにRecyclerViewを指定してone_result(レイアウト)からviewを作成
        val viewholder = ViewHolder(view)
        return viewholder
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        //データリストから1つのデータを取得し、holderの持つレイアウト上のプロパティに値を設定
        val oneData = dataList[position]
        holder.dataText?.text = oneData.dataText.toString()
        holder.itemView.setBackgroundColor(if (position%2 == 0) Color.LTGRAY else Color.WHITE)
        }
    }

    override fun getItemCount(): Int {
        return dataList.size
    }
}
Main Activityに処理を追加

onStart()メソッドに処理を追加する。

class MainActivity: AppCompatActivity() {
    private lateinit var adapter:CustomRecyclerViewAdapter
    private lateinit var layoutManager: RecyclerView.LayoutManager

    override fun onStart() {
        super.onStart()
        
        layoutManager = LinearLayoutManager(this)
        //配置したrecyclerViewを変数として呼び出し、レイアウトマネージャーを設定
        val recyclerView= findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = layoutManager

        //adapterにデータセットを渡す
        adapter = CustomRecyclerViewAdapter(dataset)
        recyclerView.adapter = this.adapter
    }


参考https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ja