RecyclerViewには項目ごとのClickListenerがありませんので、自分で実装する必要があります。
自分で実装するなら、好きなパラメータを渡したいですよね!
簡単なサンプルを以下に示します。
Kotlinで書いた場合
呼び出されるView(XML)
簡単ですが、TextViewで文字列のみ表示します。
DataBindingでBindするために、簡単ですが MyData
クラスを作成し、DataBindingで渡します。
MyData.kt
data class MyData(val name: String) {}
item_view.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="data"
type="com.example.user.kotlinrecyclerviewclicksample.MyData" />
</data>
<LinearLayout
android:id="@+id/original_LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="@{data.name}" />
</LinearLayout>
</layout>
Viewを使ったAdapter(with DataBinding)
ここで独自の onClick
を実装した MyAdapter
を用意します。
RecyclerViewに入れるので、 RecyclerView.Adapter
を継承しています。
KotlinだとBindingHolderが1行で完結するのがわかりやすくていいですね。
MyAdapter.kt
class MyAdapter(var dataList: List<MyData>) : RecyclerView.Adapter<MyAdapter.BindingHolder>() {
lateinit var listener: OnItemClickListener
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BindingHolder? {
setOnItemClickListener(listener)
val layoutInflater = LayoutInflater.from(parent!!.context)
val binding = OriginalItemLayoutBinding.inflate(layoutInflater, parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
val data = dataList[position]
holder.binding.setData(data)
holder.binding.originalLinearLayout.setOnClickListener({
listener.onClick(it, data)
})
}
override fun getItemCount(): Int {
return dataList.size
}
interface OnItemClickListener {
fun onClick(view: View, data: MyData)
}
fun setOnItemClickListener(listener: OnItemClickListener) {
this.listener = listener
}
class BindingHolder(var binding: OriginalItemLayoutBinding) : RecyclerView.ViewHolder(binding.root)
}
Activity(or Fragment)からの呼び出しとItemClickListenerの実装
通常通りadapterをセットし、ItemClickListenerを追加します。
MainActivity.kt
class MainActivity : AppCompatActivity() {
//...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val list = ArrayList<MyData>()
for (i in 0..99) {
list.add(MyData(i.toString()))
}
val adapter = MyAdapter(list)
binding.recyclerView.adapter = adapter
adapter.setOnItemClickListener(object : MyAdapter.OnItemClickListener {
override fun onClick(view: View, data: MyData) {
Toast.makeText(applicationContext, data.name, Toast.LENGTH_LONG).show()
}
})
}
}
スクショ
大したものではありませんがこのようになります(ItemClickでトーストを表示)
簡単ですが以上です。