Last active
July 22, 2020 07:14
-
-
Save ShinichiroFunatsu/56245dcaf1d91b4cd40b3907c5c1df0e to your computer and use it in GitHub Desktop.
[Android][RecyclerView] My Easy DiffUtil function for RecyclerView.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import androidx.recyclerview.widget.DiffUtil | |
import androidx.recyclerview.widget.RecyclerView | |
// allocate first | |
val defaultCallback = MutableDiffCallback() | |
fun RecyclerView.Adapter<*>.calculateDiff( | |
old: List<*>, | |
new: List<*>, | |
callback: MutableDiffCallback = defaultCallback, | |
detectMoves: Boolean = false | |
) { | |
callback.new = new | |
callback.old = old | |
DiffUtil.calculateDiff(callback, detectMoves) | |
.dispatchUpdatesTo(this) | |
} | |
open class MutableDiffCallback( | |
var old: List<*>? = null, | |
var new: List<*>? = null | |
) : DiffUtil.Callback() { | |
override fun getOldListSize() = old?.size ?: 0 | |
override fun getNewListSize() = new?.size ?: 0 | |
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { | |
val o = old ?: return false | |
val n = new ?: return false | |
// warn: not equals | |
return o[oldItemPosition] === n[newItemPosition] | |
} | |
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { | |
val o = old ?: return false | |
val n = new ?: return false | |
return o[oldItemPosition] == n[newItemPosition] | |
} | |
} |
smarter than using setOnClickListener
in onBindViewHolder
!!
interface OnClickPositionListener {
fun onClickWithPosition(position: Int)
}
@BindingAdapter("app:onClickWithPosition")
fun onClickWithPosition(view: View, listener: OnClickPositionListener) {
view.setOnClickListener {
val viewHolder = view.tag as? RecyclerView.ViewHolder ?: return@setOnClickListener
val position = viewHolder.adapterPosition
listener.onClickWithPosition(position)
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
and Delegates.observable combo!