使用binding-adapter告別新建Adapter和ViewHolder

使用binding-adapter告別新建Adapter和ViewHolder

binding-adapter 是一個使用ViewBinding/DataBinding 直接生成RecyclerView Adapter的庫。

將Adapter扁平化,不用創(chuàng)建Adapter類,避免傳輸Item點擊事件、Item長按事件、元素點擊事件等,直接在Activity中處理。

項目地址binding-adapter

特點

  • 無需創(chuàng)建ViewHolder,無需創(chuàng)建Adapter

  • 直接操作View,再也不需要View id以及findViewById

  • 支持ViewBinding、DataBinding

  • 支持下拉刷新

  • 支持Item的點擊事件監(jiān)聽

  • 支持添加任意Header和Footer

  • 支持多布局配置

  • 支持Paging3下拉加載更多

  • 支持添加加載狀態(tài)(加載中、無更多數(shù)據(jù)、加載失敗、加載完成)

  • 支持加載失敗點擊重試

  • 支持沒有數(shù)據(jù)時顯示空布局

  • 支持折疊和展開items

  • 支持隱藏item(不占用布局位置)

  • 支持GirdLayoutManager

  • 強(qiáng)大的拓展性和自由度

  • 不依賴任何第三方庫,輕量(方法數(shù)<40,體積<23kb)

  • 無反射

  • 極簡的設(shè)計,所見即所得

安裝

添加倉庫

//in build.gradle(Project)
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

// 新版方式 settings.gradle
dependencyResolutionManagement {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

添加依賴

//in build.gradle(module)
dependencies {
    //core
    implementation "com.github.ve3344.binding-adapter:binding-adapter:1.0.0"
    //paging support
    implementation "com.github.ve3344.binding-adapter:binding-adapter-paging:1.0.0"
}

基本使用

  1. 開啟ViewBinding/DataBinding
android {
    ...
    buildFeatures {
        viewBinding = true
        dataBinding = true
    }
}
  1. 創(chuàng)建Item的布局item_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

開啟ViewBinding/DataBinding后,會自動生成ItemPageBinding文件

  1. 生成Adapter

生成Adapter需要3個主要參數(shù),布局(即剛剛生成的ItemPageBinding),初始數(shù)據(jù)列表(可為空),布局和元素的綁定器。

在綁定器內(nèi),配置對ui元素和bean屬性之間的綁定,設(shè)置點擊事件等。

如果使用DataBinding 記得在綁定器內(nèi)調(diào)用executePendingBindings()方法

val list = listOf(
    PageItemBean("Simple", MutableActivity::class.java),
)
val adapter=BindingAdapter(ItemPageBinding::inflate, list) { position, item ->
    binding.title.text = item.title
    binding.title.setOnClickListener {
        startActivity(Intent(this@MainActivity, item.clz))
    }
}

添加Header和Footer

  1. 創(chuàng)建Header布局header_simple如下,得到HeaderSimpleBinding。同理創(chuàng)建Footer布局得到FooterSimpleBinding。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:background="#DDDDDD"
    >
    <TextView
        android:id="@+id/tips"
        android:layout_width="match_parent"
        android:text="Header"
        android:gravity="center"
        android:layout_height="match_parent"/>
</LinearLayout>
  1. 分別使用SingleViewBindingAdapter生成單個View的Adapter,然后直接使用+拼接。

拼接順序即Header、內(nèi)容、Footer的相對位置。

得益于ConcatAdapter的靈活性,你可以在任意地方添加布局,而不僅僅是Header、Footer

val header = SingleViewBindingAdapter(HeaderSimpleBinding::inflate)
val footer = SingleViewBindingAdapter(FooterSimpleBinding::inflate)

binding.list.adapter = header + adapter + footer

控制列表元素隱藏和顯示

BindingAdapter 添加了isVisible 屬性,直接控制元素的隱藏和顯示。

adapter.isVisible = isChecked

效果

img.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容