Recyclerview with different listener for different view
AddressAdapter
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
class AddressAdapter (private val listener: (AddressData, Int,Int) -> Unit):
RecyclerView.Adapter<AddressViewHolder>() {
var lstAddress = emptyList<AddressData>()
fun setData(items: List<AddressData>) {
lstAddress = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddressViewHolder {
return AddressViewHolder.create(parent)
}
override fun getItemCount(): Int {
return lstAddress.size
}
override fun onBindViewHolder(holder: AddressViewHolder, position: Int) {
return holder.bind(lstAddress[position], listener, position)
}
fun getData(): List<AddressData> {
return lstAddress
}
}
AddressViewHolder
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_address.view.*
class AddressViewHolder(override val containerView: View) :
RecyclerView.ViewHolder(containerView), LayoutContainer {
companion object {
fun create(parent: ViewGroup): AddressViewHolder {
val view =
LayoutInflater.from(parent.context)
.inflate(R.layout.item_address, parent, false)
return AddressViewHolder(view)
}
}
fun bind(
item: AddressData,
listener: (AddressData, Int,Int) -> Unit,
position: Int
) {
item.address.let {
itemView.tvAddress.text = it
}
itemView.tvEdit.setOnClickListener {
listener.invoke(item, position,R.id.tvEdit)
}
itemView.tvDelete.setOnClickListener {
listener.invoke(item, position,R.id.tvDelete)
}
itemView . tvAddress . setOnClickListener {
listener.invoke(item, position, R.id.tvAddress)
}
}
}
item_address
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvWorkPlace"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="@dimen/letter_medium"
android:layout_marginTop="@dimen/letter_medium"
android:gravity="top"
android:text="@string/work_place"
android:textColor="@color/black_color"
android:textSize="@dimen/letter_medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginStart="@dimen/spacing_medium"
android:text="@string/txt_default"
android:textColor="#002D56"
android:textSize="@dimen/letter_small"
app:layout_constraintBottom_toBottomOf="@+id/tvWorkPlace"
app:layout_constraintStart_toEndOf="@+id/tvWorkPlace"
app:layout_constraintTop_toTopOf="@+id/tvWorkPlace" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/spacing_small"
android:text="76 Playfair Road, #04-06, LHK2, Singapore 367996"
android:textSize="@dimen/letter_small"
app:layout_constraintStart_toStartOf="@+id/tvWorkPlace"
app:layout_constraintTop_toBottomOf="@+id/tvWorkPlace" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/spacing_large"
android:text="@string/txt_edit"
android:textAllCaps="true"
android:textColor="@color/colorSecondary"
android:textSize="@dimen/letter_small"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@+id/tvAddress"
app:layout_constraintTop_toBottomOf="@+id/tvAddress" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginStart="@dimen/spacing_large"
android:text="@string/txt_delete"
android:textAllCaps="true"
android:textColor="@color/colorPrimaryNew"
android:textSize="@dimen/letter_small"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/tvEdit"
app:layout_constraintTop_toTopOf="@+id/tvEdit" />
<View
android:layout_width="match_parent"
android:layout_height="0.2dp"
android:layout_marginTop="@dimen/spacing_medium"
android:background="@color/divider_color"
app:layout_constraintTop_toBottomOf="@+id/tvDelete" />
</androidx.constraintlayout.widget.ConstraintLayout>
AddressData
class AddressData (
var code: Int,
var address:String
)
In Activity
private fun setUpAdapter() {
adapter = AddressAdapter(fun(item: AddressData, position: Int, type: Int) {
when (type) {
R.id.tvEdit -> {
context.showToast(
"Editbtn" + position,
showInReleaseBuild = true
)
}
R.id.tvDelete -> {
context.showToast(
"Deletebtn" + position,
showInReleaseBuild = true
)
}
R.id.tvAddress -> {
context.showToast(
"addressbtn" + position,
showInReleaseBuild = true
)
}
}
})
rvAddress.adapter = adapter
rvAddress.setEmptyView(llEmptyViewMain)
val addressData = AddressData(1, "abcd")
val addressData1 = AddressData(2, "abceeed")
lstData = listOf(addressData, addressData1)
adapter.setData(lstData)
}
CustomRecycler Xml
<com.example.views.CustomRecyclerView
android:id="@+id/rvAddress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/mediumSize"
android:layout_marginTop="@dimen/mediumSize"
android:layout_marginEnd="@dimen/mediumSize"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:list_type="list"
tools:listitem="@layout/item_address" />
<include layout="@layout/layout_recycler_emptyview" />