防止实例化项目 android instantiateItem

Prevent instantiating items android instantiateItem

当前的乐趣:

override fun instantiateItem(container: ViewGroup, position: Int): Any {
    val view = AuthorizationHeaderView(context = context)
    updateViewContent(view, data[position])
    timeUpdateListeners.add(view as TimeUpdateListener)
    container.addView(view, 0)
    return view
}

但现在我不想多次更新视图。因为在调用适配器时我有一个方法:instantiateItem 调用了几次。

我正在尝试重写如下:

private val map = HashMap<String, View>()

之后想这样写:

if (map.containsKey(position)
    return map.get(position)
else
//make view and add to cotnainer
val view = makeView()
container.add(view)
map.put(position, view)

但是重写我现在的方法有一些困难。

已通过下一个解决方案解决:

override fun instantiateItem(container: ViewGroup, position: Int): Any {
    val value: View? = map[position]
    val view = if (value != null) value
    else {
        val view = AuthorizationHeaderView(context = context)
        map.put(position, view)
        view
    }
    updateViewContent(view, data[position])
    timeUpdateListeners.add(view as TimeUpdateListener)
    container.addView(view, 0)
    return view
}

您可以为此使用 getOrPut

val view = map.getOrPut(position) { makeView().also { container.addView(it) } }

或展开 also,如果您觉得更易读:

val view = map.getOrPut(position) { 
    val tmp = makeView()
    container.addView(tmp)
    tmp
}

以上假设您只想在新创建的视图上调用 container.add,否则只是

val view = map.getOrPut(position) { makeView() }
container.addView(view)

对于您的特定代码,它是

override fun instantiateItem(container: ViewGroup, position: Int): Any {
    val view = map.getOrPut(position) {
        AuthorizationHeaderView(context = context)
    }
    updateViewContent(view, data[position])
    timeUpdateListeners.add(view as TimeUpdateListener)
    container.addView(view, 0)
    return view
}