9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现
簡介
主要會通過安卓實戰來講解kotlin語法和實際應用,本教程設及知識點包括框架模式mvp+mvvm, Databinding(數據綁定框架),Dagger2(依賴注入框架),DeepLink(頁面路由框架),Rxjava,RxAndroid(異步操作框架),Retrofit,Okhtttp等,不過本教程重點在kotlin所以這些框架需要了解可自行百度。
針對人群:Android中級以上,kotlin入門
本系列最后一篇我們看看recyclerView的adapter怎么實現的
首先先看一下代碼
/*** Created by bigman on 18-05-18.*/ class AndroidAdapter(private val mList: List<AndroidBean>) :BaseBindingAdapter<ItemAndroidBinding>() {override fun getItemCount(): Int {return mList.size}override fun onBindViewHolder(holder: DataBoundViewHolder<ItemAndroidBinding>, position: Int) {super.onBindViewHolder(holder, position)//數據綁定holder.binding.androidbean = mList[position]//數據立即綁定而不是在下一幀的時候才綁定,避免閃爍和數據錯亂holder.binding.executePendingBindings()}override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): DataBoundViewHolder<ItemAndroidBinding> {return DataBoundViewHolder(ItemAndroidBinding.inflate(LayoutInflater.from(parent.context), parent, false))} }首先看主構造函數和繼承
class AndroidAdapter(private val mList: List<AndroidBean>) :BaseBindingAdapter<ItemAndroidBinding>()下一步我們看一下基類BaseBindingAdapter的具體實現
/*** Created by bigman on 18-05-18.*/ abstract class BaseBindingAdapter<B : ViewDataBinding>: RecyclerView.Adapter<DataBoundViewHolder<B>>() {var mListener: ((pos: Int) -> Unit)? = nulloverride fun onBindViewHolder(holder: DataBoundViewHolder<B>, position: Int) {holder.binding.root.setOnClickListener {mListener?.invoke(holder.adapterPosition)}}fun setOnItemClickListener(listener: ((pos: Int) -> Unit)) {mListener = listener}}- 大家可以看到BaseBindingAdapter需要傳入ViewDataBinding類型,這個ViewDataBinding是databinding里面所有視圖bingding類的基類,
- 然后毫無疑問它必須繼承于RecyclerView.Adapter<DataBoundViewHolder<B>>,這個我們平時寫java的RecyclerView.Adapter的時候都需要繼承的
這里還有一個DataBoundViewHolder<B>,看一下代碼實現
其實它就是一個RecyclerView.ViewHolder,只是這里我們傳入了通用的ViewDataBinding使它變成可以綁定任意視圖
回到BaseBindingAdapter,這個基類主要功能就是實現一個通用的databinding用的適配器,只要傳入databinding視圖類型即可,類內部提供了一個點擊事件的回調方法
然后再回到AndroidAdapter
這里主要由三個方法,
- getItemCount ()返回綁定列表長度,
- onBindViewHolder ()實現視圖數據綁定,這里用的databingding的數據綁定,holder.binding.executePendingBindings(),這句代碼比較重要不加可能導致數據錯亂或者頁面閃爍
- onCreateViewHolder()主要是完成databinding的holder構建
這里的 ItemAndroidBinding是databinding根據我們的布局文件自動生成的,我們看一下我們這個列表條目布局代碼,名稱item_android.xml注意對比databinding生成的binding類名稱
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto"><data><import type="android.view.View" /><variablename="androidbean"type="com.bigman.kotlin.bean.AndroidBean" /></data><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_marginLeft="2dp"android:layout_marginRight="2dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:background="#fff"android:orientation="vertical"app:cardCornerRadius="5dp"android:paddingTop="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="vertical"android:paddingLeft="16dp"android:paddingBottom="10dp"android:paddingRight="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{androidbean.desc}"android:textColor="#000"android:textSize="16sp" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:layout_marginTop="10dp"android:scaleType="center"android:visibility="@{androidbean.hasImg()?View.VISIBLE:View.GONE}"app:load_image="@{androidbean.images[0]}" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_marginTop="10dp"android:text="@{androidbean.who}"android:layout_weight="1"android:layout_width="0dp"android:layout_height="wrap_content"/><TextViewandroid:layout_marginTop="10dp"android:text = "@{androidbean.create()}"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></LinearLayout></android.support.v7.widget.CardView> </layout>具體代碼和前面說過的布局沒啥太大區別,主要就是data數據的傳入和數據綁定
眼神比較犀利的同學可能會看到幾個比較不一樣的地方而存在疑惑,我們看看是哪里
<ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:layout_marginTop="10dp"android:scaleType="center"android:visibility="@{androidbean.hasImg()?View.VISIBLE:View.GONE}"app:load_image="@{androidbean.images[0]}" />這里的app:load_image這是''databinding允許的一個函數綁定形式
我們看一下具體實現:
這幾個函數被我卸載隨意的一個kt文件里面,然后通過 @BindingAdapter注解,我們的databinding框架就能很容易的找到它
那么我們這一系列kotlin 安卓實戰內容到這里結束了,雖然kotlin知識點講的不錯,但是基本的運用知道這些也差不多夠了,大家可以自己動手寫一下,本系列主要目的已經達到,就是kotlin在這種mvp+mvvm目前最合理框架上的具體應用
歡迎一起交流,有問題加群交流
kotlin實戰交流群群二維碼.png總結
以上是生活随笔為你收集整理的9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是否有必要使用 Oracle 向量数据库
- 下一篇: 2018年全国卷Ⅰ卷理科数学解析版