〈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