時間: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)
這樣我們就已經有一個類和它的構造函數、不可變屬性、以及一些有用的函數實現,如:equals
或 hashCode
。
適配器
適配器的結構如下,它自創建一些必須的方法:
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應用程序,我建議您去獲取免費指南,它教您怎樣建立您的第一個項目,或者獲取這本書,它教您怎樣從頭開始創建一個完整的應用程序。