Skip to content

Instantly share code, notes, and snippets.

@osipxd
Last active December 9, 2020 09:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osipxd/db9e394d6ac13ac49a7264bf2bd73f76 to your computer and use it in GitHub Desktop.
Save osipxd/db9e394d6ac13ac49a7264bf2bd73f76 to your computer and use it in GitHub Desktop.
The snippet to show when update callback is called.
import androidx.paging.AsyncPagingDataDiffer
import androidx.paging.PagingData
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListUpdateCallback
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
val differ: AsyncPagingDataDiffer<String> by lazy {
AsyncPagingDataDiffer(
diffCallback = diffCallback,
updateCallback = updateCallback,
mainDispatcher = Dispatchers.Unconfined,
workerDispatcher = Dispatchers.Unconfined,
)
}
val diffCallback = object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String) = oldItem.first() == newItem.first()
override fun areContentsTheSame(oldItem: String, newItem: String) = oldItem == newItem
}
val updateCallback = object : ListUpdateCallback {
override fun onInserted(position: Int, count: Int) {
println("onInserted: ${differ.snapshot()}")
}
override fun onRemoved(position: Int, count: Int) {
println("onRemoved: ${differ.snapshot()}")
}
override fun onMoved(fromPosition: Int, toPosition: Int) {
println("onMoved: ${differ.snapshot()}")
}
override fun onChanged(position: Int, count: Int, payload: Any?) {
println("onChanged: ${differ.snapshot()}")
}
}
differ.addLoadStateListener {
println("loadStateListener: ${differ.snapshot()}")
}
runBlocking {
println()
differ.submitData(PagingData.from(listOf("A", "B", "C")))
println("after onInserted: ${differ.snapshot()}")
println()
differ.submitData(PagingData.from(listOf("A", "C")))
println("after onRemoved: ${differ.snapshot()}")
println()
differ.submitData(PagingData.from(listOf("C", "A")))
println("after onMoved: ${differ.snapshot()}")
println()
differ.submitData(PagingData.from(listOf("Changed", "A")))
println("after onChanged: ${differ.snapshot()}")
}
@osipxd
Copy link
Author

osipxd commented Dec 8, 2020

Output:

loadStateListener: []

onInserted: []
loadStateListener: [A, B, C]
after onInserted: [A, B, C]

onRemoved: [A, B, C]
after onRemoved: [A, C]

onMoved: [A, C]
after onMoved: [C, A]

onChanged: [C, A]
after onChanged: [Changed, A]

Expected that snapshot in the callback and after callback will be the same. LoadStateListener not always triggered on data change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment