we tried doing something like this. helps great de...
# compose
r
we tried doing something like this. helps great deal in performance.
Copy code
@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.
Copy code
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
     }
 }
🧵 4