簡単にイベントを実装させたい人向き。
RecyclerViewの基本的な仕組みや記述の仕方はこちらを参照。
簡単に説明すると、アクティビティに作成した関数の参照をRecyclerView.Adapterを継承するクラスに渡してあげて、そこでsetOnClickListenerに渡してあげればいい。
まずはビューホルダーでボタンなどイベントを発生させるUI部品のインスタンスを取得し、プロパティとして公開しておく。
こうすると、イベント発生時にアクティビティの関数が呼ばれるので、いろいろ操作するときに楽になる。
RecyclerViewの基本的な仕組みや記述の仕方はこちらを参照。
簡単に説明すると、アクティビティに作成した関数の参照をRecyclerView.Adapterを継承するクラスに渡してあげて、そこでsetOnClickListenerに渡してあげればいい。
まずはビューホルダーでボタンなどイベントを発生させるUI部品のインスタンスを取得し、プロパティとして公開しておく。
class RecycleViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
val tvName: TextView = view.findViewById(R.id.tvName)
val tvPrice: TextView = view.findViewById(R.id.tvPrice)
val btnButton: Button = view.findViewById(R.id.btnButton)
}
次にアダプタのほうにイベント時に実行させたい関数を格納る変数をプロパティとして公開しておく
class RecycleViewAdapter(val list: List<RowData>) : RecyclerView.Adapter<RecycleViewHolder>() {
var onButtonClick : (View) -> Unit by Delegates.notNull()
//省略・・・
次にアクティビティのほうでイベント発生時に実行させる関数を実装し、先ほど作成したアダプタのプロパティに関数を参照として渡しておく。class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var list: MutableList<RowData> = mutableListOf()
val recyclerView: RecyclerView = findViewById(R.id.rvRecyclerView)
//it.onButtonClickに、このクラスに作成した関数を参照として渡す
recyclerView.adapter = RecycleViewAdapter(list).also { it.onButtonClick = this::onClick }
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
}
//イベント発生時に実行させたい関数
fun onClick(view: View): Unit {
Log.v("nullpo", "ぬるぬる")
}
}
最後にボタンのイベントに対して設定してあげる。こうすると、イベント発生時にアクティビティの関数が呼ばれるので、いろいろ操作するときに楽になる。
class RecycleViewAdapter(val list: List<RowData>) : RecyclerView.Adapter<RecycleViewHolder>() {
//イベント発生時に実行させたい関数の参照を保存しておくプロパティ
var onButtonClick : (View) -> Unit by Delegates.notNull()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecycleViewHolder {
return RecycleViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.recycle_layout, parent, false))
}
override fun getItemCount(): Int {
return list.count()
}
override fun onBindViewHolder(holder: RecycleViewHolder, position: Int) {
holder.tvName.text = list[position].name
holder.tvPrice.text = list[position].price.toString()
//ボタンのsetOnClickListenerに対して関数を割り当てる
holder.btnButton.setOnClickListener(onButtonClick)
}
}