防止实例化项目 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
}
当前的乐趣:
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
}