Skip to content

Instantly share code, notes, and snippets.

@sumeetph
sumeetph / ViewCacheExtension.kt
Last active February 7, 2022 10:55
RecyclerView and View level caching
//Return cached view holder for particular position
private val viewCacheExtension = object : ViewCacheExtension() {
override fun getViewForPositionAndType(
recycler: Recycler,
position: Int,
type: Int
): View? {
val cachedItemId = getItemId(position)
if (cachedViewHolderTypes.contains(type) && cachedItemId != NO_CACHED_ITEM_ID
&& cachedItems.containsKey(cachedItemId)
@sumeetph
sumeetph / CacheOnViewDeatched.kt
Created February 7, 2022 10:59
CacheOnViewDeatched
//Saving the cached item once it goes out of screen
override fun onViewDetachedFromWindow(holder: ViewHolder) {
if (cachedViewHolderTypes.contains(holder.itemViewType)) {
val pos = holder.bindingAdapterPosition
Timber.d("onViewDetached called for position : $pos")
if (pos > -1) {
holder.setIsRecyclable(false)
cachedItems[getCachedItemId(pos)] = holder
}
@sumeetph
sumeetph / CacheObserverOnChanged.kt
Last active March 3, 2022 14:24
Cache OnChanged callback
override fun onChanged() {
Timber.d("items added or moved")
if (cachedItems.isEmpty())
return
val iterator: MutableIterator<String> = cachedItems.keys.iterator()
val newItemsIds = mutableSetOf<String>()
for (newIndex in 0 until itemCount) {
@sumeetph
sumeetph / CacheObserverOnItemRemoved.kt
Last active March 3, 2022 14:21
Cache OnItem Removed
override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
Timber.d("On Item range removed called for adapter observer")
if (cachedItems.isEmpty())
return
val iterator: MutableIterator<String> = cachedItems.keys.iterator()
while (iterator.hasNext()) {
val cachedItemId = iterator.next()
val index = cachedItems[cachedItemId]?.bindingAdapterPosition ?: -1
if (index != -1 && positionStart <= index && index < positionStart + itemCount) {
@sumeetph
sumeetph / BaseAdapterWithCaching.kt
Last active March 3, 2022 14:28
BaseAdapterWithCaching
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.*
import timber.log.Timber
import java.util.HashSet
import java.util.concurrent.ConcurrentHashMap
/**
* Created by Sumeet on 24,January,2022