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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

超级封装RecyclerView的适配器Adapter 只需二三十行代码

發布時間:2025/3/21 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 超级封装RecyclerView的适配器Adapter 只需二三十行代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

android開發中,RecyclerView是很常用的控件,而且功能也很強大,并且各種三方封裝或者擴展庫也是非常多,如:BaseQuickAdapter,XRecyclerview,當然還有我以前封裝的LtRecyclerView

比如BaseQuickAdapter雖然封裝的非常方便,但那是相對于java語言,那用kotlin能不能使Adapter的封裝更方便呢?答案是可以

第一次簡單封裝

/*** 封裝適配器,適用于單條目** @param T bean類的泛型* @param VH ViewHolder的泛型*/ abstract class BaseAdapterOneType<T, VH : RecyclerView.ViewHolder>(val list: MutableList<T>) : RecyclerView.Adapter<VH>() {/*** 給view設置數據*/abstract fun setData(b: T, i: Int, h: VH)override fun onBindViewHolder(holder: VH, position: Int) = setData(list[position], position, holder)override fun getItemCount() = list.size }

使用起來需要繼承該類,并重寫setData方法和寫一個ViewHolder,如下:

fun initView(){.....rv.adapter = MainAdapter(arrayListOf())//設置適配器}class MainAdapter(list: MutableList<String>) : BaseAdapterOneType<String, MainAdapterVH>(list) {override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MainAdapterVH = MainAdapterVH(LayoutInflater.from(p0.context).inflate(R.layout.item_pop_text, p0, false))//設置布局override fun setData(b: String, i: Int, h: MainAdapterVH) {//設置數據h.tv.text = b}}class MainAdapterVH(val v: View) : RecyclerView.ViewHolder(v) {//查找Viewval tv = v.tv1}

但是這樣和java差不多,寫起來還是比較麻煩

第二次封裝,簡少所需代碼

abstract class BaseAdapterOneType3<T>(val list: MutableList<T>, @LayoutRes val layoutId: Int) : RecyclerView.Adapter<BaseViewHolder>() {/*** 給view設置數據*/abstract fun setData(v: View, b: T, i: Int, h: BaseViewHolder)override fun onBindViewHolder(holder: BaseViewHolder, position: Int) = setData(holder.itemView, list[position], position, holder)override fun getItemCount() = list.sizeoverride fun onCreateViewHolder(p0: ViewGroup, p1: Int): BaseViewHolder = BaseViewHolder(LayoutInflater.from(p0.context).inflate(layoutId, p0, false)) }class BaseViewHolder(private val view: View) : RecyclerView.ViewHolder(view)

使用起來就很方便了,只需要重寫setData方法,如下:

fun initView(){...rv.adapter = MainAdapter(arrayListOf())}class MainAdapter(list: MutableList<String>) : BaseAdapterOneType3<String>(list, R.layout.item_pop_text) {override fun setData(v: View, b: String, i: Int, h: BaseViewHolder) {//利用Kotlin的特性,直接使用id來查找控件v.tv1.text = b}}

這樣封裝后用起來就方便的多了

等等,你以為這樣就結束了嗎?看性能!

我們來看一下MainAdapter編譯后的字節碼做了什么

ps:通過Koltin自帶的插件,然后點擊Decompile按鈕來還原成java代碼

如下:

首先構造和下面的泛型轉換的setData方法不用看,檢查Null的也不用看,主要看下面兩行

TextView var10000 = (TextView)v.findViewById(id.tv1); var10000.setText((CharSequence)b);

通過上面的代碼會發現,每次走setData(onBindViewHolder)都會進行findViewById,如果是一個經常滾動的列表,則會頻繁的調用setData方法,則沒有用到RecyclerView.ViewHolder,效率變低

中間我想過,參考Activity的方式在公用的ViewHolder里維護一個HashMap<Int,View>,并提供一個get方法,但是這樣跟BaseQuickAdapter的寫法就一樣了,比較繁瑣,pass

后來又想,通過by委托給一個類,讓其存儲鍵值對和泛型信息,但是后來發現并不行,直到有一次靈光一現!

第三次封裝,既少寫代碼又性能ok

abstract class BaseLtAdapterOneType<T>(var list: MutableList<T>, @LayoutRes private val itemLayoutId: Int) : RecyclerView.Adapter<BaseLtViewHolder>() {abstract fun setData(v: BaseLtViewHolder.ViewFind, b: T, i: Int, h: BaseLtViewHolder)override fun onBindViewHolder(holder: BaseLtViewHolder, position: Int) = setData(holder.viewFind, list[position], position, holder)override fun getItemCount() = list.sizeoverride fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = BaseLtViewHolder(parent.inflate(itemLayoutId)) }/*** 使用方便的ViewHolder*/ class BaseLtViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {val viewFind: ViewFind = ViewFind().apply { this.setView(this@BaseLtViewHolder.view) }/*** 使用kt的框架來快捷查找view,并且帶有緩存*/class ViewFind : Fragment() {private lateinit var mView: Viewfun setView(view: View) {this.mView = view}override fun getView(): View? {return mView}} }

實現思路,有一次我想,既然Fragment中能用Kotlin的框架直接來findViewById,那能不能找找是從哪個方法獲取父View的,然后發現原來是getView這個方法,而且還可以進行復寫,于是就給RecyclerView.ViewHolder的itemView加了一層Fragment,然后在setData中用Fragment來查找View,這樣既寫著方便,并且在Fragment中還有緩存(Kotlin框架的實現),簡直完美

使用方法如下:

fun initView(){...rv.adapter = MainAdapter(arrayListOf())}class MainAdapter(list: MutableList<String>) : BaseLtAdapterOneType<String>(list, R.layout.item_pop_text) {override fun setData(v: BaseLtViewHolder.ViewFind, b: String, i: Int, h: BaseLtViewHolder) {//在這里直接通過Fragment來查找View,并設置屬性v.tv1.text = b}}

并且查看編譯后的代碼確實有緩存:

ps:后來發現可以使用LayoutContainer,性能可以更好,可以參考https://github.com/ltttttttttttt/ltviews里的ltviewsx里的BaseAdapterOneType和BaseLtViewHolder

利用IDEA的Live Templates來快捷生成代碼

有的同學說,還是很多樣板代碼,不想寫怎么辦,emmm...有的辦,使用Live Templates

打開設置,根據圖的步驟添加

起一個名字,然后說明用途,并粘貼進入以下代碼

class $className$(list: MutableList<$T$>) : BaseLtAdapterOneType<$T$>(list, R.layout.$next$) {override fun setData(v: BaseLtViewHolder.ViewFind, b: $T$, i: Int, h: BaseLtViewHolder) {$code$} }

按照下面圖示勾上Kotlin

然后點擊右邊的Edit variables按鈕,設置成如下圖的樣子

然后新建一個Kotlin File,在空白處輸入badapter,就會自動生成實現類,填入泛型和layoutId后就可以開心的用了

結語

emmm,好了,封裝結束,小伙伴們可以直接復制最后一種封裝方式,然后快樂的用RecyclerView編碼了

當然,如果用的是別人封裝過的adapter,也可以使用該方式進行二次封裝,可以書寫更方便

RecyclerView.Adapter還能在簡化或優化性能嗎?其實還有存貨,不過等下次有時間了在寫吧 \滑稽

總結

以上是生活随笔為你收集整理的超级封装RecyclerView的适配器Adapter 只需二三十行代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产在线一二三区 | 亚洲aⅴ | 国产另类ts人妖一区二区 | 91网站免费| 日韩精品第二页 | 久久久久精| 大香伊人久久 | 日韩成人性视频 | 岳奶大又白下面又肥又黑水多 | 玖玖视频 | 在线观看欧美成人 | 91精品综合久久久久久五月天 | 欧美一级淫片免费 | 国产亚洲一区二区三区四区 | 毛茸茸多毛bbb毛多视频 | 亚洲欧美日韩国产一区二区 | 国产精品不卡一区二区三区 | 在线免费观看黄网站 | 欧美黑人性xxx猛交 少妇无套内谢久久久久 | 国产二区在线播放 | 狼人狠狠干 | 美丽的姑娘在线观看 | 波多野结衣精品视频 | 丝袜老师让我了一夜网站 | 巨乳女教师的诱惑 | 日日弄天天弄美女bbbb | 超碰在线最新 | 波多野结衣视频网址 | 欧美一级视频在线观看 | 国产福利资源 | 极品少妇在线观看 | 日韩欧美高清dvd碟片 | 婷婷综合影院 | 男人天堂网在线 | 国产精品久久久久久av | 青青青在线免费 | 亚洲第五页 | 亚洲精品在线中文字幕 | 在线看一区| 国产xxxx在线观看 | 国产人人射| 亚洲欧洲免费 | 国产成人精品午夜福利Av免费 | 国产精品久久久国产盗摄 | 国产高清一级片 | 日韩欧美中文字幕精品 | 中文在线字幕免费观看 | 99在线视频精品 | 日韩一区二区精品 | 亚洲激情网站 | 国产内射合集颜射 | 激情综合在线 | 成人免费视频国产免费麻豆 | 含羞草一区二区 | 91成人高清 | 日韩精品一区二区三区不卡在线 | 国产精品a久久久久 | 五月情网 | 国产在线播放一区 | av在线资源站 | 午夜电影在线播放 | 黄色小视频免费观看 | 亚洲国产精品成人综合 | 成年人国产视频 | 亚洲av无码一区二区乱子伦as | 免费视频久久久 | 黄色免费网站在线 | 香蕉视频在线网站 | 丰满岳妇伦在线播放 | 国产又粗又黄视频 | av在线日韩 | 免费日韩在线视频 | 日本特黄网站 | 国产一区91精品张津瑜 | 国产女人高潮的av毛片 | 久久精品一二区 | 99视频精品在线 | 夫妻自拍偷拍 | 香蕉视频色版 | 黄频在线看| 久久亚洲精品无码va白人极品 | 黄色在线视频播放 | 老司机免费在线视频 | 开心激情站 | 亚洲精品无码永久在线观看 | xxxxx黄色片 噜噜噜噜噜色 | 四季av一区二区三区免费观看 | 欧美乱妇狂野欧美在线视频 | 免费成人深夜夜 | 老司机深夜网站 | 婷婷深爱 | 亚洲少妇精品 | 五月婷婷深深爱 | 轮番上阵免费观看在线电影 | 免费在线观看av网址 | 欧美大黄视频 | 性色av蜜臀av浪潮av老女人 | 91亚洲一区二区三区 | 国产精品九九九 |