PagerAdapter 中 context 和 findViewById() 的使用错误?
Wrong usage of context and findViewById() in PagerAdapter?
在现有的 Android 应用程序项目(MVVM 用作模式)中,我发现了一个 PagerAdapter 可以在此适配器中刷取多个信息:
class InformationSlideAdapter(ctx: Context) : PagerAdapter() {
private var contextCopy = ctx
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val layoutInflater = contextCopy.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val layoutScreen = layoutInflater.inflate(R.layout.slide_item, null)
val imageView = layoutScreen.findViewById<ImageView>(R.id.iv_logo)
//..
}
}
问题一:为什么要使用findViewById()?数据绑定不应该也为 PageAdapter 解决这个问题吗?
问题 2:每当我在任何其他 class 中找到上下文而不是我的视图时(尤其是当使用 MVVM 时),这对我来说是非常反模式的。为什么在那里提供上下文?有没有不使用的原因
val imageView = container.findViewById<ImageView>(R.id.iv_logo)
没有前面两条线膨胀?
问题 3:尽管代码可以正常工作(目前).. 在 kotlin 中如何处理副本?
private var contextCopy = ctx
这里用Kotlin创建了一个完整的新副本实例?例如。当我翻转屏幕时,相应 InformationSlideActivity
中的上下文可以正确处理这个问题,但是我的 InformationSlideAdapter
仍然有一个旧的上下文实例,处于未翻转状态?
不幸的是我不能问编码员,因为他已经走了。
提前致谢
Pav
问题一:
可以使用数据绑定或合成来代替 findViewById。这可能是遗留代码或给定视图的 ID,可能有更多视图具有相同的 ID,开发人员希望通过在特定布局中搜索来避免歧义。
问题二:
注入或传递上下文(在大多数情况下)是一种反模式。如果需要上下文,可以从容器中检索它。
之间的差异
layoutScreen.findViewById<ImageView>(R.id.iv_logo)
和
container.findViewById<ImageView>(R.id.iv_logo)
是第一个在新膨胀的布局中搜索,在那个时间点可能附加也可能不附加到容器。
问题 3:
private var contextCopy = ctx
这没有意义,它只是在制作参考副本。鉴于上下文作为构造函数参数传递,开发人员可能不知道他们可以执行以下操作:
class InformationSlideAdapter(val ctx: Context, list: List<RelevantItem>) : PagerAdapter() {
在任何一种情况下,上下文都不会被刷新,并且要有一个新的实例,应该重新创建适配器
根据问题 2 的回答,上下文不应传递给适配器,而是从容器中检索。
在现有的 Android 应用程序项目(MVVM 用作模式)中,我发现了一个 PagerAdapter 可以在此适配器中刷取多个信息:
class InformationSlideAdapter(ctx: Context) : PagerAdapter() {
private var contextCopy = ctx
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val layoutInflater = contextCopy.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val layoutScreen = layoutInflater.inflate(R.layout.slide_item, null)
val imageView = layoutScreen.findViewById<ImageView>(R.id.iv_logo)
//..
}
}
问题一:为什么要使用findViewById()?数据绑定不应该也为 PageAdapter 解决这个问题吗?
问题 2:每当我在任何其他 class 中找到上下文而不是我的视图时(尤其是当使用 MVVM 时),这对我来说是非常反模式的。为什么在那里提供上下文?有没有不使用的原因
val imageView = container.findViewById<ImageView>(R.id.iv_logo)
没有前面两条线膨胀?
问题 3:尽管代码可以正常工作(目前).. 在 kotlin 中如何处理副本?
private var contextCopy = ctx
这里用Kotlin创建了一个完整的新副本实例?例如。当我翻转屏幕时,相应 InformationSlideActivity
中的上下文可以正确处理这个问题,但是我的 InformationSlideAdapter
仍然有一个旧的上下文实例,处于未翻转状态?
不幸的是我不能问编码员,因为他已经走了。
提前致谢
Pav
问题一: 可以使用数据绑定或合成来代替 findViewById。这可能是遗留代码或给定视图的 ID,可能有更多视图具有相同的 ID,开发人员希望通过在特定布局中搜索来避免歧义。
问题二: 注入或传递上下文(在大多数情况下)是一种反模式。如果需要上下文,可以从容器中检索它。 之间的差异
layoutScreen.findViewById<ImageView>(R.id.iv_logo)
和
container.findViewById<ImageView>(R.id.iv_logo)
是第一个在新膨胀的布局中搜索,在那个时间点可能附加也可能不附加到容器。
问题 3:
private var contextCopy = ctx
这没有意义,它只是在制作参考副本。鉴于上下文作为构造函数参数传递,开发人员可能不知道他们可以执行以下操作:
class InformationSlideAdapter(val ctx: Context, list: List<RelevantItem>) : PagerAdapter() {
在任何一种情况下,上下文都不会被刷新,并且要有一个新的实例,应该重新创建适配器 根据问题 2 的回答,上下文不应传递给适配器,而是从容器中检索。