Kotlin+RecyclerView+DataBindingでItemClickListerを実装する

RecyclerViewには項目ごとのClickListenerがありませんので、自分で実装する必要があります。

自分で実装するなら、好きなパラメータを渡したいですよね！
簡単なサンプルを以下に示します。

# Kotlinで書いた場合
## 呼び出されるView（XML）

簡単ですが、TextViewで文字列のみ表示します。
DataBindingでBindするために、簡単ですが `MyData` クラスを作成し、DataBindingで渡します。

```kotlin: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が１行で完結するのがわかりやすくていいですね。

```kotlin: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を追加します。


```kotlin: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でトーストを表示）
![Screenshot_1516591961.png](https://qiita-image-store.s3.amazonaws.com/0/84307/77e2b395-310a-5cf4-ab77-29f9b7d58be8.png)


簡単ですが以上です。