在Kotlin編寫RecyclerView適配器(KAD 16)

做者:Antonio Leivaandroid

時間:Mar 14, 2017ide

原文連接:https://antonioleiva.com/recyclerview-adapter-kotlin/函數

 

經過建立RecyclerView適配器,Kotlin能夠簡化您的生活,這是一個有趣的方法。工具

 

在這個方法中,您能夠看到更易閱讀的代碼組織,且避免冗餘代碼。學習

 

Kotlin的RecyclerView適配器

 

咱們建立一個適配器時,要設置標題和將圖形插入進各單元內。ui

 

咱們不容許項目的更改,這就是個很是簡單的適配器。若是咱們要更新數據,就須要建立新的適配器,並將數據設置到RecyclerView中。this

 

模型

 

 

咱們也用一個很是簡單的模型,它僅須要一個標識符、標題和圖形的URL。url

 

咱們將用一個數據類,您還記得咱們幾篇見過spa

1 data class Item(val id: Long, val title: String, val url: String)

 

這樣咱們就已經有一個類和它的構造函數、不可變屬性、以及一些有用的函數實現,如:equalshashCode3d

 

適配器

 

適配器的結構以下,它自建立一些必須的方法:

 1 class MyAdapter : RecyclerView.Adapter() {
 2      
 3     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
 4     }
 5  
 6     override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
 7     }
 8  
 9     override fun getItemCount(): Int {
10     }
11  
12     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }

 

您將看見我已經建立了一個由原始ViewHolder擴展而來的ViewHolder類。

 

這是由於適配器須要原始抽象類的實現。

 

另外,有些元素被標註爲nullable。這是由於若是庫沒有適當的@Nullable@NonNull標註,Kotlin就沒有方法知道null是否容許,這就要讓咱們來決定了。

 

若是咱們經過默認方式自建立方法了,它就會認爲其值是nullable

 

可是,進一步研究支持庫,咱們就知道哪些值是爲null,因此咱們可以刪除它。

 1 class MyAdapter : RecyclerView.Adapter() {
 2     
 3     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
 4     }
 5  
 6     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
 7     }
 8  
 9     override fun getItemCount(): Int {
10     }
11  
12     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }

 

構造函數

 

適配器須要接收參數項目和偵聽器。這就像這樣:

class MyAdapter(val items: List, val listener: (Item) -> Unit)

 

方法的實現很是容易。我用建立擴展函數方法膨脹視圖:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(parent.inflate(R.layout.view_item))
 
override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(items[position], listener)
 
override fun getItemCount() = items.size

 

有三個方法能夠實現由簡約的形式,得到之前的結果。用三行咱們就實現了完整的適配器。

 

如今就去實現ViewHolder

 

ViewHolder

 

ViewHolder由模型分配值到它們相應的視圖:

1 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
2     fun bind(item: Item, listener: (Item) -> Unit) = with(itemView) {
3         itemTitle.text = item.title
4         itemImage.loadUrl(item.url)
5         setOnClickListener { listener(item) }
6     }
7 }

 

這裏的每件事都已經在其餘文章中讀到:with函數ImageView的loadUrl擴展函數Kotlin Android擴展訪問視圖,和點擊偵聽映射

 

適配器賦值

 

如今僅剩一件事:將適配器賦值到視圖:

1 recycler.layoutManager = GridLayoutManager(this, 2)
2 recycler.adapter = MyAdapter(items) {
3     toast("${it.title} Clicked")
4 }

 

最後一個函數是偵聽器,它接收一項。當您點擊這項時,代碼就簡單地將標題打印到該項上。

 

結論

 

Kotlin中實現RecyclerView就這麼簡單。

 

到目前爲止,咱們使用一些學過的工具,已將代碼簡化到最低程度。

 

若是您要學習更多的全部這些,以嫺熟方法建立您本身的Android應用程序,我建議您去獲取免費指南,它教您怎樣創建您的第一個項目,或者獲取本書,它教您怎樣從頭開始建立一個完整的應用程序。

相關文章
相關標籤/搜索