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


作者:Antonio Leiva

時間:Mar 14, 2017

原文鏈接:https://antonioleiva.com/recyclerview-adapter-kotlin/

 

通過創建RecyclerView適配器,Kotlin可以簡化您的生活,這是一個有趣的方法。

 

在這個方法中,您可以看到更易閱讀的代碼組織,且避免冗余代碼。

 

Kotlin的RecyclerView適配器

 

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

 

我們不允許項目的更改,這就是個非常簡單的適配器。如果我們要更新數據,就需要創建新的適配器,並將數據設置到RecyclerView中。

 

模型

 

 

我們也用一個非常簡單的模型,它僅需要一個標識符、標題和圖形的URL。

 

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

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

 

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

 

適配器

 

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

 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應用程序,我建議您去獲取免費指南,它教您怎樣建立您的第一個項目,或者獲取本書,它教您怎樣從頭開始創建一個完整的應用程序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM