どうも。どっことです。今回はRecyclerView
をより実用的に利用する場合の実装方法について解説します。
RecyclerViewでのコンテンツ一覧のカスタマイズ
前回の解説では、RecyclerView
の必要最低限の実装について解説しました。しかしこれだけでは実用性に欠いており、より実用に近いケースが必要なことを課題として挙げていました。
今回は前回に挙げた課題、つまり以下の内容を解説していきたいと思います。
- 表示要素を動的にする。
- データベースやAPIから取得した情報を一覧に表示するようなケースを解説します。
- クリックしたらその要素に対応する画面を表示したい。(クリックリスナーの制御)
-
RecyclerView
で表示しているコンテンツに対応するページに遷移させる実装を解説します。
それぞれ解説します。
RecyclerViewの表示要素を動的に制御する
実装の手順は以下の通りです。
-
CustomAdapter
のコンストラクタに表示要素のリストを追加する。 getCount()
メソッドを修正する。-
表示要素の配列を使って
onBindViewHolder()
でViewをカスタマイズする。
順番に解説していきます。
CustomAdapterのコンストラクタに表示要素のリストを追加する
CustomAdapter
に、表示要素を管理するリストを渡します。今回はToDoリストを意識して以下のTodoクラスをあらかじめ用意します。
data class Todo(val id: Int, val title: String)
このデータのリストをCustomAdapter
のコンストラクタで渡します。
class CustomAdapter(private val list: List<Todo>) : RecyclerView.Adapter<ViewHolder>()
getCount()メソッドを修正する
表示要素の数を設定します。表示要素は前項のリストの要素数と同じになるはずです。
override fun getItemCount(): Int {
return list.size
}
表示要素の配列を使ってonBindViewHolder()でViewをカスタマイズする
ViewHolder
に表示要素を反映していきます。onBindViewHolder
では表示要素の位置がパラメータとして参照できるのでそれを使って表示要素にアクセスします。
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (holder is CustomViewHolder) {
val todo = list[position]
holder.textView.text = todo.title
}
}
クリックしたらその要素に対応する画面を表示する
実装手順は以下の通りです。
- タップ時のインターフェースを用意する。
View
がタップされた時の処理を追加する。-
CustomAdapter
内でView
がタップされた時の処理を設定する。
こちらも順に解説します。
タップ時のインターフェースを用意する
Viewがタップされた時に、Activity
/Fragment
に必要な情報を渡すためのインターフェースを実装します。Todoクラスのデータを渡すように定義します。
interface ToDoClickListener {
fun onClickToDo(todo: Todo)
}
このインターフェースをCustomAdapter
のコンストラクタに追加します。
class CustomAdapter(
private val list: List<Todo>,
private val listener: ToDoClickListener
) : RecyclerView.Adapter<ViewHolder>() {
Viewがタップされた時の処理を追加する
Viewがタップされた時の実装をします。Todoデータへのアクセスが必要なので、この処理もonBindViewHolder
に実装するとハマることなく実装できます。
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (holder is CustomViewHolder) {
val todo = list[position]
holder.textView.text = todo.title
holder.itemView.setOnClickListener {
listener.onClickToDo(todo) // 要素がタップされたら、それに対応するTodoデータを渡す
}
}
}
CustomAdapter内でViewがタップされた時の処理を設定する
Viewがタップされた時に、インターフェースから渡された情報を使って必要な処理をするよう実装します。例えば、渡されたTodoデータを渡す形で、詳細画面に実装するなどでしょうか。インターフェースの実装はActivity
/Fragment
に実装しても良いですし、実装した無名オブジェクトを渡しても問題ありません。今回は無名オブジェクトを渡します。
val adapter = CustomAdapter(listOf(
Todo(0, "買い物"),
Todo(1, "掃除"),
Todo(2, "洗濯")
), object : ToDoClickListener {
override fun onClickToDo(todo: Todo) {
// 画面に反映、画面遷移など必要な処理を実装する
}
})
まとめ
今回はRecyclerView
をより実用的に利用する場合の実装方法について解説しました。RecyclerView
によるコンテンツ表示はカスタマイズ性が高く、さまざまな利用パターンに当てはめられるので、今後もRecyclerView
によるコンテンツ表示について解説していきます。