rishabhsinghbisht
11/21/2022, 3:49 AM@Composable
fun <T : View> RecyclerAndroidView(
type: String,
viewPool: ViewPool?,
factory: (Context) -> T,
modifier: Modifier = Modifier,
update: (T) -> Unit = NoOpUpdate,
) {
val viewFactoryHolderRef = remember { Ref<T>() }
val finalViewPool = viewPool ?: LocalViewPool.current
AndroidView(
factory = {
val newView: T = finalViewPool?.getView(type) ?: factory(it)
viewFactoryHolderRef.value = newView
newView
},
modifier = modifier,
update = update
)
DisposableEffect(
key1 = Unit,
effect = {
onDispose {
logDebug("RecyclerAndroidView", "$type: dispose")
viewFactoryHolderRef.value?.let {
viewPool?.addToPool(it, type)
}
}
}
)
}
and this is the simple view pool.
class ViewPool {
val viewList = mutableMapOf<String, MutableList<View>>()
fun <T : View> getView(
type: String
): T? {
return (viewList[type]?.popIf { it.parent == null }) as? T
}
fun addToPool(
item: View,
type: String
) {
val list = viewList[type] ?: mutableListOf()
list.add(item)
viewList[type] = list
}
private inline fun <T> MutableList<T>.popIf(predicate: (T) -> Boolean): T? {
val index = indexOfFirst { predicate(it) }
return if (index != -1) {
val item = get(index)
removeAt(index)
item
} else null
}
}