繁体   English   中英

PagerAdapter 中上下文和 findViewById() 的错误使用?

[英]Wrong usage of context and findViewById() in PagerAdapter?

在现有的 Android App 项目(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)
        //..
    }
}

问题1:为什么要用findViewById()? 数据绑定不应该也为 PageAdapters 解决这个问题吗?

问题 2:每当我在任何其他 class 中找到与我的看法不同的上下文时(尤其是在使用 MVVM 时),这对我来说都是非常反模式的。 为什么在那里提供上下文? 有没有理由不使用

    val imageView = container.findViewById<ImageView>(R.id.iv_logo)

没有膨胀前面的两条线?

问题 3:尽管代码正在运行(目前).. kotlin 中的副本如何处理?

    private var contextCopy = ctx

这里在 Kotlin 中创建了一个完整的新副本实例? 例如,当我翻转屏幕时,相应InformationSlideActivity中的上下文会正确处理此问题,但我的InformationSlideAdapter仍然有一个旧的上下文实例,其中未翻转的 state?

不幸的是,我不能问编码员,因为他已经走了。

提前谢谢

帕夫

问题 1:可以使用数据绑定或合成来代替 findViewById。 这可能是遗留代码或给定视图的 id,可能有更多具有相同 id 的视图,开发人员希望通过在特定布局中搜索来避免歧义。

问题 2:注入或传递上下文(在大多数情况下)是一种反模式。 如果需要上下文,可以从容器中检索它。 和...之间的不同

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 的答案,不应将上下文传递给适配器,而是从容器中检索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM