日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现

發(fā)布時間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

主要會通過安卓實(shí)戰(zhàn)來講解kotlin語法和實(shí)際應(yīng)用,本教程設(shè)及知識點(diǎn)包括框架模式mvp+mvvm, Databinding(數(shù)據(jù)綁定框架),Dagger2(依賴注入框架),DeepLink(頁面路由框架),Rxjava,RxAndroid(異步操作框架),Retrofit,Okhtttp等,不過本教程重點(diǎn)在kotlin所以這些框架需要了解可自行百度。

針對人群:Android中級以上,kotlin入門


本系列最后一篇我們看看recyclerView的adapter怎么實(shí)現(xiàn)的


首先先看一下代碼

/*** 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)//數(shù)據(jù)綁定holder.binding.androidbean = mList[position]//數(shù)據(jù)立即綁定而不是在下一幀的時候才綁定,避免閃爍和數(shù)據(jù)錯亂holder.binding.executePendingBindings()}override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): DataBoundViewHolder<ItemAndroidBinding> {return DataBoundViewHolder(ItemAndroidBinding.inflate(LayoutInflater.from(parent.context), parent, false))} }

首先看主構(gòu)造函數(shù)和繼承

class AndroidAdapter(private val mList: List<AndroidBean>) :BaseBindingAdapter<ItemAndroidBinding>()
  • 主構(gòu)造函數(shù)傳入一個List<AndroidBean>類型的mList只讀變量
  • 繼承至BaseBindingAdapter<ItemAndroidBinding>()
  • 下一步我們看一下基類BaseBindingAdapter的具體實(shí)現(xiàn)

    /*** 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>,看一下代碼實(shí)現(xiàn)
    /*** Created by bigman on 18-05-18.*/class DataBoundViewHolder<T : ViewDataBinding>(val binding:T) : RecyclerView.ViewHolder(binding.root) { }

    其實(shí)它就是一個RecyclerView.ViewHolder,只是這里我們傳入了通用的ViewDataBinding使它變成可以綁定任意視圖

    回到BaseBindingAdapter,這個基類主要功能就是實(shí)現(xiàn)一個通用的databinding用的適配器,只要傳入databinding視圖類型即可,類內(nèi)部提供了一個點(diǎn)擊事件的回調(diào)方法

    然后再回到AndroidAdapter
    這里主要由三個方法,

    • getItemCount ()返回綁定列表長度,
    • onBindViewHolder ()實(shí)現(xiàn)視圖數(shù)據(jù)綁定,這里用的databingding的數(shù)據(jù)綁定,holder.binding.executePendingBindings(),這句代碼比較重要不加可能導(dǎo)致數(shù)據(jù)錯亂或者頁面閃爍
    • onCreateViewHolder()主要是完成databinding的holder構(gòu)建
    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): DataBoundViewHolder<ItemAndroidBinding> {return DataBoundViewHolder(ItemAndroidBinding.inflate(LayoutInflater.from(parent.context), parent, false))}

    這里的 ItemAndroidBinding是databinding根據(jù)我們的布局文件自動生成的,我們看一下我們這個列表?xiàng)l目布局代碼,名稱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>

    具體代碼和前面說過的布局沒啥太大區(qū)別,主要就是data數(shù)據(jù)的傳入和數(shù)據(jù)綁定

    眼神比較犀利的同學(xué)可能會看到幾個比較不一樣的地方而存在疑惑,我們看看是哪里

    <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允許的一個函數(shù)綁定形式
    我們看一下具體實(shí)現(xiàn):

    /*** Created by bigman on 18-05-18.*/@BindingAdapter("load_image") fun loadImage(imageView: ImageView, url: String?) =Glide.with(imageView.context).load(url).crossFade().into(imageView)@BindingAdapter("set_text") fun setText(textView: TextView, string: String) {textView.setText("bigman" + string) }@BindingAdapter("load_asset") fun loadAsset(imageView: ImageView, id: Int) =Glide.with(imageView.context).load(id).into(imageView)

    這幾個函數(shù)被我卸載隨意的一個kt文件里面,然后通過 @BindingAdapter注解,我們的databinding框架就能很容易的找到它

    那么我們這一系列kotlin 安卓實(shí)戰(zhàn)內(nèi)容到這里結(jié)束了,雖然kotlin知識點(diǎn)講的不錯,但是基本的運(yùn)用知道這些也差不多夠了,大家可以自己動手寫一下,本系列主要目的已經(jīng)達(dá)到,就是kotlin在這種mvp+mvvm目前最合理框架上的具體應(yīng)用


    歡迎一起交流,有問題加群交流

    kotlin實(shí)戰(zhàn)交流群群二維碼.png

    總結(jié)

    以上是生活随笔為你收集整理的9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。