LoginSignup
28
25

More than 5 years have passed since last update.

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

Posted at

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でトーストを表示)
Screenshot_1516591961.png

簡単ですが以上です。

28
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
25