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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)

發布時間:2023/12/10 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前發過一個databinding版的通用adapter,能實現一般需求,不過功能比較簡陋,實際開發中大家更傾向于使用BRVAH等功能豐富的第三方框架。現在給出一個基于BRVAH的databinding版通用Adapter。

BaseAdapter

abstract class BaseAdapter

(private val brId: Int, layoutId: Int, dataList: MutableList?)

: BaseQuickAdapter(layoutId, dataList) {

...

}

構造函數比較長,兩個泛型,T代表item的model類型即dataList的bean類型,TBinding代表itemLayout對應生成的XXXBinding類,比如itemLayout是fruit_item.xml,對應的就是FruitItemBinding。三個個參數dataList和layoutId應該不用解釋,brId則對應itemLayout里相應variable的變量名,比如variable的name是fruit,brId就是BR.fruit。

數據綁定

override fun onItemViewHolderCreated(viewHolder: BaseViewHolder, viewType: Int) {

DataBindingUtil.bind(viewHolder.itemView)

}

final override fun convert(helper: BaseViewHolder, item: T) = convert(helper, item, helper.layoutPosition)

//final override fun convert(helper: BaseViewHolder, item: T, payloads: List) = convert(helper, item, helper.layoutPosition, payloads)

protected open fun convert(holder: BaseViewHolder, item: T, position: Int) {

holder.getBinding()?.apply {

setVariable(brId, item)

executePendingBindings()

}

}

//protected open fun convert(holder: BaseViewHolder, item: T, position: Int, payloads: List) {}

重寫onItemViewHolderCreated方法傳入泛型TBinding,并在convert方法里執行綁定。這里暴露了一個重載方法convert(holder: BaseViewHolder, item: T, position: Int)。用過BRVAH的程序猿都知道默認的convert方法里并不提供當前item對應的position,這點不方便導致該框架被問的最多的問題之一就是“如何在convert方法里獲取position” -_-! 這里直接在原來的convert方法里調用新增的重載方法并傳入當前的position,這樣在子類里我們重寫convert方法時就可以直接獲得當前的position了。同時原convert方法被設置為final類型以確保其在子類中不被重寫。

點擊監聽擴展

BRVAH默認的setOnItemClickListener有一點不好,就是不提供當前的item,只能通過dataList[position]或adpter.getItem(position) as T來獲取。前者可能需要我們將dataList設置為全局變量,后者更是需要做強制類型轉換,都不是很方便。現在我們丟掉自帶監聽,重新實現一個能提供當前item的點擊監聽方法。

private var onItemClickListener: ((BaseAdapter, View, Int, T) -> Unit)? = null

private var onItemLongClickListener: ((BaseAdapter, View, Int, T) -> Boolean)? = null

private var onItemChildClickListener: ((BaseAdapter, View, Int, T) -> Unit)? = null

private var onItemChildLongClickListener: ((BaseAdapter, View, Int, T) -> Boolean)? = null

protected open fun setOnItemClick(view: View, position: Int, item: T) {

onItemClickListener?.invoke(this, view, position, item)

}

protected open fun setOnItemLongClick(view: View, position: Int, item: T): Boolean {

return onItemLongClickListener?.invoke(this, view, position, item) ?: false

}

protected open fun setOnItemChildClick(view: View, position: Int, item: T) {

onItemChildClickListener?.invoke(this, view, position, item)

}

protected open fun setOnItemChildLongClick(view: View, position: Int, item: T): Boolean {

return onItemChildLongClickListener?.invoke(this, view, position, item) ?: false

}

fun setOnItemClickListener(listener: (BaseAdapter, View, Int, T) -> Unit) {

onItemClickListener = listener

}

fun setOnItemLongClickListener(listener: (BaseAdapter, View, Int, T) -> Boolean) {

onItemLongClickListener = listener

}

fun setOnItemChildClickListener(listener: (BaseAdapter, View, Int, T) -> Unit) {

onItemChildClickListener = listener

}

fun setOnItemChildLongClickListener(listener: (BaseAdapter, View, Int, T) -> Boolean) {

onItemChildLongClickListener = listener

}

override fun bindViewClickListener(viewHolder: BaseViewHolder, viewType: Int) {

onItemClickListener?.let {

viewHolder.itemView.setOnClickListener { v ->

var position = viewHolder.adapterPosition

if (position == RecyclerView.NO_POSITION) {

return@setOnClickListener

}

position -= headerLayoutCount

setOnItemClick(v, position, getItem(position))

}

}

onItemLongClickListener?.let {

viewHolder.itemView.setOnLongClickListener { v ->

var position = viewHolder.adapterPosition

if (position == RecyclerView.NO_POSITION) {

return@setOnLongClickListener false

}

position -= headerLayoutCount

setOnItemLongClick(v, position, getItem(position))

}

}

onItemChildClickListener?.let {

for (id in getChildClickViewIds()) {

viewHolder.itemView.findViewById(id)?.let { childView ->

if (!childView.isClickable) {

childView.isClickable = true

}

childView.setOnClickListener { v ->

var position = viewHolder.adapterPosition

if (position == RecyclerView.NO_POSITION) {

return@setOnClickListener

}

position -= headerLayoutCount

setOnItemChildClick(v, position, getItem(position))

}

}

}

}

onItemChildLongClickListener?.let {

for (id in getChildLongClickViewIds()) {

viewHolder.itemView.findViewById(id)?.let { childView ->

if (!childView.isLongClickable) {

childView.isLongClickable = true

}

childView.setOnLongClickListener { v ->

var position = viewHolder.adapterPosition

if (position == RecyclerView.NO_POSITION) {

return@setOnLongClickListener false

}

position -= headerLayoutCount

setOnItemChildLongClick(v, position, getItem(position))

}

}

}

}

}

因為一并重寫了長按和子控件的監聽所以代碼略有點長,其實只需要看onItemClickListener,setOnItemClick,setOnItemClickListener和bindViewClickListener這四個方法就行了。

首先private var onItemClickListener: ((BaseAdapter, View, Int, T) -> Unit)? = null這里onItemClickListener是一個函數對象(在kotlin里萬物皆可定義為對象),具體實現在setOnItemClickListener時指定。setOnItemClick相比框架的原版方法多了一個參數item: T,以便暴露當前的item。然后重寫BRVAH的bindViewClickListener方法,將原版的setOnItemLongClick方法換成我們修改版的并傳入當前item。

這里順便提一下為什么不用接口來實現監聽。在java里我們通常使用接口來實現監聽回調,但在kotlin里更推薦將監聽接口直接定義為函數對象,因為kotlin接口不支持轉換為lambda表達式,而函數對象可以(kotlin調用java接口也可以)。如果要通過接口實現同時又不舍得放棄lambda,則只能將接口寫在外面的java類中。(不想多此一舉的話,還是選擇函數對象吧)

實現類adapter

class FruitAdapter (layoutId: Int, brId: Int, itemList: MutableList) : BaseAdapter(layoutId, brId, itemList)

一行代碼就搞定了!如果需要執行其他操作,就跟用BRVAH一樣重寫convert方法

override fun convert(holder: BaseViewHolder, item: Fruit, position: Int) {

super.convert(holder, item, position) //別忘了調用父類方法,否則不會執行綁定

...

}

同時BaseQuickAdapter的其他功能都被保留!

擴展閱讀

總結

以上是生活随笔為你收集整理的android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)的全部內容,希望文章能夠幫你解決所遇到的問題。

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