做者:Antonio Leivaandroid
時間:Mar 14, 2017ide
原文連接:https://antonioleiva.com/recyclerview-adapter-kotlin/函數
經過建立RecyclerView適配器,Kotlin能夠簡化您的生活,這是一個有趣的方法。工具
在這個方法中,您能夠看到更易閱讀的代碼組織,且避免冗餘代碼。學習
咱們建立一個適配器時,要設置標題和將圖形插入進各單元內。ui
咱們不容許項目的更改,這就是個很是簡單的適配器。若是咱們要更新數據,就須要建立新的適配器,並將數據設置到RecyclerView
中。this
咱們也用一個很是簡單的模型,它僅須要一個標識符、標題和圖形的URL。url
咱們將用一個數據類,您還記得咱們在前幾篇文章見過:spa
1 data class Item(val id: Long, val title: String, val url: String)
這樣咱們就已經有一個類和它的構造函數、不可變屬性、以及一些有用的函數實現,如:equals
或 hashCode
。
3d
適配器的結構以下,它自建立一些必須的方法:
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
由模型分配值到它們相應的視圖:
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應用程序,我建議您去獲取免費指南,它教您怎樣創建您的第一個項目,或者獲取這本書,它教您怎樣從頭開始建立一個完整的應用程序。