StickyHeaders
StickyHeaders copied to clipboard
[Feature] Add DiffUtil support
Add DiffUtil support which will allow the ability to dispatch updates to a sectioned list.
https://medium.com/@nullthemall/diffutil-is-a-must-797502bc1149#.f33ov92og
I personally use SortedList
(https://developer.android.com/reference/android/support/v7/util/SortedList) in my SectioningAdapter
(one for each section)
Old issue but I didn't use this before so maybe this is helpful for others that are searching in 2019. Workaround in Kotlin:
class ListAdapter(
private val items: List<ListObject>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), StickyHeaders {
private var stickyHeadersObserver: RecyclerView.AdapterDataObserver? = null
override fun registerAdapterDataObserver(observer: RecyclerView.AdapterDataObserver) {
super.registerAdapterDataObserver(observer)
if (observer::class.java.enclosingClass == StickyHeadersLinearLayoutManager::class.java) {
stickyHeadersObserver = observer
}
}
override fun unregisterAdapterDataObserver(observer: RecyclerView.AdapterDataObserver) {
super.unregisterAdapterDataObserver(observer)
if (observer == stickyHeadersObserver) {
stickyHeadersObserver = null
}
}
fun updateItems(newItems: List<ListObject>) {
// Create a DiffUtil.DiffResult and dispatch it
getListDiff(items, newItems).dispatchUpdatesTo(this)
this.items= newItems
stickyHeadersObserver?.onChanged()
}
}
Basically you can catch the observer and then call onchanged yourself after setting the new items. Because the observer class is a private inner class of StickyHeadersLinearLayoutManager, we check if the enclosing class is that one and therefore we know we have the correct observer. This is made with version 1.0.1.