StickyHeaders icon indicating copy to clipboard operation
StickyHeaders copied to clipboard

[Feature] Add DiffUtil support

Open REWKyleB opened this issue 7 years ago • 2 comments

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

REWKyleB avatar Sep 07 '16 17:09 REWKyleB

I personally use SortedList(https://developer.android.com/reference/android/support/v7/util/SortedList) in my SectioningAdapter (one for each section)

AlBlanc avatar Nov 22 '18 16:11 AlBlanc

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.

joost-klitsie avatar Feb 28 '19 08:02 joost-klitsie