簡體   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