防止实例化项目安卓实例化项目



享受当前的乐趣:

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)

但是如何重写我当前的方法存在一些困难。

您可以使用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
}

用下一个解决方案解决:

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
}

最新更新