![](/img/trans.png)
[英]How to get view binding to work with XML layout heights in RecyclerView.ViewHolder like they did with Kotlin Synthetics?
[英]How to convert Kotlin synthetics to view binding for inflated XML in a loop?
在嘗試將應用程序從已失效的 Kotlin 合成轉換為更新/支持的視圖綁定方法時,我遇到了這個問題,其中布局在循環中膨脹並附加到目標父視圖:
for (item in itemList) {
val view = LayoutInflater.from(this).inflate(R.layout.imageitem_row, binding.linear, false)
view.text1.text = item.title
view.text2.text = item.pubdate
binding.linear.addView(view)
}
由於 Kotlin 合成正在從代碼中刪除,因此text1
和text2
不是view
有效屬性。 那么如何將視圖綁定應用到這個膨脹的布局呢? 或者這在這里不起作用,我應該使用findViewById()
代替text1
和text2
?
只是為了解釋發生了什么 - 使用合成庫,它基本上是在活動本身(或其他)中進行視圖綁定。 對於布局中帶有 id 的每個視圖,它添加了一個您可以直接訪問的屬性。 所以你可以在當前范圍內調用text1.text
,它會自動綁定到層次結構中的視圖。
使用視圖綁定,沒有魔法,也沒有將屬性扔到頂級范圍內。 相反,每個布局都有一個自動生成的類,並在名稱的末尾添加了Binding
,例如ImageItemRowBinding
。 這個類有一個屬性,每個視圖都有一個id,所以它都封裝在一個地方。
您可以在其上調用bind(view)
以獲取分配了所有屬性的實例(通過在您傳入的view
層次結構中找到它們),或者如果您還沒有視圖並且想要它,則可以調用inflate
在它具有約束力的同時膨脹它。 您最終會得到一個綁定類的實例,並分配了所有視圖屬性(並且您可以通過root
屬性訪問視圖層次結構的頂部)。
除此之外,基本上是一樣的! 您只需要手動創建綁定實例,並通過它訪問您的視圖。 不要忘記,您可以使用像with(binding)
或binding.run { }
類的 Kotlin 函數來處理其屬性,而無需每次都使用binding
前綴,因此如果方便,您幾乎可以將原始的基於合成的代碼包裝起來
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.