I know how to implement DiffUtil if the adapter receive single data type objects.
But in my case I have an adapter which get two data types from a fragment.
So how can I use DiffUtil with multiple data types?
Here is my adapter code:
class VisitorsAdapter(val listener: VisitorsViewHolder.OnVisitorClicked) :
RecyclerView.Adapter<BaseViewHolder<*>>() {
private var visitorsData = mutableListOf<Any>()
private var isOwner = true
fun setData(visitorsData: List<Any>) {
Log.e("TAG", "setData called")
this.visitorsData.clear()
var currentVisitors = mutableListOf<CurrentVisitorResponseItem>()
var leavedVisitors = mutableListOf<LeavedVisitorsResponseItem>()
for (visitor in visitorsData) {
when (visitor) {
is CurrentVisitorResponseItem -> currentVisitors.add(visitor)
is LeavedVisitorsResponseItem -> leavedVisitors.add(visitor)
}
}
currentVisitors = currentVisitors.sortedBy { it.roomNumber?.toInt() }.toMutableList()
leavedVisitors = leavedVisitors.sortedBy { it.room }.toMutableList()
this.visitorsData.addAll(currentVisitors)
this.visitorsData.addAll(leavedVisitors)
notifyDataSetChanged()
}
fun isOwner(chooser: Boolean) {
this.isOwner = chooser
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
return VisitorsViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.visitor_item, parent, false)
)
}
override fun getItemCount() = visitorsData.size
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
val dataPositioned = visitorsData[position]
when (holder) {
is VisitorsViewHolder -> {
holder.bind(dataPositioned, position, listener, isOwner)
}
}
}
}
Note: I have 2 types of data:
1- CurrentVisitorResponseItem
2- LeavedVisitorsResponseItem