享受当前的乐趣:
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
}