问题描述
我有一个 RecyclerView
包含可能非常复杂的视图,如果它们及时膨胀,它们的膨胀会使滚动不稳定。我的想法是我可以在后台线程中预膨胀视图。我已经试过了,它在模拟器和我的 Pixel 3 上都运行得非常好。需要明确的是,它们只是膨胀而不是提前添加到父级。
我找到了 this SO 线程,他们说三星 galaxy 手机似乎存在问题,但该线程已使用近 10 年,所以我不确定这是否仍然是一个问题。
谷歌当然说不要这样做。见here。尽管他们提到的原因(主要是内存泄漏)不适用于我的情况。或者至少我在这里没有看到可能的 Activity 泄漏。
这是我正在做的简化:
class MyRecyclerAdapter(
private var items: List<Item>
) : RecyclerView.Adapter<MyViewHolder>() {
// Map to hold the pre-cached views
private val viewCache = mutableMapOf<Int,Deferred<View?>>()
companion object {
// Only inflate one view at a time
val serialCoroutinedispatcher = Executors.newFixedThreadPool(1).asCoroutinedispatcher()
}
init {
items.forEachIndexed { index,it ->
viewCache[index] = Coroutinescope(serialCoroutinedispatcher).async {
createViewForItem(it) // View is created asynchronously here
}
}
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int) =
runBlocking {
MyViewHolder(
// If no view in cache,inflate here
viewCache.remove(viewType)?.await() ?: createViewForItem(items[viewType])
)
}
...
有人试过类似的吗?或者有人可以告诉我为什么我不应该这样做(除了泄露 Activity 在这里不是问题)?
仅供参考:我知道 AsyncLayoutInflater
,但由于其他原因我不能使用它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)