1. 程式人生 > >【譯】Android Data Binding: RecyclerView

【譯】Android Data Binding: RecyclerView

英文:Android Data Binding: RecyclerView     Reduce, Reuse, Rebind

有時候我會這樣想,Data Binding並不意味著Android Data Binding。RecyclerView有它獨有的繫結資料的方式,它有一個包含兩個非常重要方法的Adapter ,我們需要實現這兩個方法來繫結data:

image.png

RecyclerView在API中提供了通用的ViewHolder模式。在 onCreateViewHolder()方法中,被建立的View和ViewHolder有著關聯所以data可以很快的設定。接著在 onBindView()方法中,特定的data被分配給view。


Android Data Binding in RecyclerView


在上一篇文章中說過,Android Data Binding 可以像 ViewHolder 模式一樣。理想化來看,我們只需要在 onCreateViewHolder()中返回一個生成的Binding類就好了,但是它並不繼承自RecyclerView.ViewHolder。所以需要用一個包含Binding類的ViewHolder來替代。

現在,我們就可以用Android Data Binding 來進行綁定了。

「譯」Android Data Binding: RecyclerView


如果你是一行行的看下來,你會在MyViewHolder.bind()的最後看到executePendingBindings()方法。這個方法迫使資料立即繫結而不是在下一幀的時候才繫結。RecyclerView會在onBindViewHolder方法執行後立即測量這些view。假設沒使用executePendingBindings()方法,由於在下一幀的時候才會繫結,view就會繫結錯誤的data,測量也會出錯。因此,executePendingBindings()是很重要的。

複用ViewHolder

如果你以前用過RecyclerView的ViewHolder,就會發現在繫結data到view的過程中,我們寫了一堆�結構相似的程式碼。不幸的是,我們還是需要為不同的RecyclerView寫一堆的ViewHolder。還有當你需要多種檢視型別的時候,又怎麼做呢?我們來解決這些問題。

通常來說只會有一個數據物件被傳給一個數據繫結的類,就像前面的item。當你使用這種模式,你可以用命名約定來為所有的RecyclerView和所有的檢視型別構造一個單一的ViewHolder。我們將一個檢視物件模型的名字命名為"obj"。你可能更喜歡"item"或者"data",但是現在我們叫它"obj"。

「譯」Android Data Binding: RecyclerView


在 MyViewHolder 中,我們使用 ViewDataBinding (所有生成的binding類的基類),來替代特定的 ItemBinding 。這樣的話 ,我們就可以在我們的 ViewHolder 中 提供任意的layout。除了特殊的類,我也使用setVariable()來替代型別安全,setObj()方法幫助我們為我們所需要的任意檢視物件型別賦值。需要注意的是變數必須叫做"obj",因為我們在setVariable()中是用BR.obj作為key的。這意味著你必須要在你的layout檔案裡有一個這樣的variable 標籤:

「譯」Android Data Binding: RecyclerView


當然,你的variable 會有其它的型別 ,你可以根據layout的需要用任意的資料型別來替代 "Item" 。

我們可以為所有RecylerView 介面卡的建立一個基類。

「譯」Android Data Binding: RecyclerView


在這個 Adapter 中,layout ID 被用來作為檢視型別,所以可以更簡單的繫結檢視。這讓Adapter 可以處理了任意的佈局,但是用的最多的還是單一佈局的RecyclerView 。 所以我們可以為此編寫一個基類:

「譯」Android Data Binding: RecyclerView


What’s Left?

現在需要你做的只剩下載入資料,通知 adapter 資料有改變等等。Android Data Binding 只是減少了枯燥的部分。

你也可以提供多種的 variable,通常會提供一個事件處理的物件來處理一些事件,比如點選事件,而且想傳遞一個檢視模型的類給這個事件。如果你一直在Activity或者Fragment中處理,你可以新增這些variable 。只要你一直使用一致的命名,就可以在所有使用RecyclerView 的地方使用這種技巧。

使用Android Data Binding 結合 RecyclerView 是很簡單的,而且顯著的減少了模板式的程式碼。你的應用將只需要一個ViewHolder 並且再也不需要重寫onCreateViewHolder() 或者 onBindViewHolder()了!

Thanks to Yigit Boyar.

相關知識:Android Data Binding簡明教程