radapter
使用 radapter柳弄,你可以方便的構(gòu)造多種類型的列表視圖舶胀。
前言
三個月沒有更新博客了,主要是因為最近換了工作碧注,在新公司還在摸爬滾打嚣伐,沒有時間更新,心想2018年就要結(jié)束了萍丐,不能留下遺憾纤控,于是趁著元旦假期來一發(fā),biu~ 以后應(yīng)該會正常更新碉纺,感謝關(guān)注的朋友們船万。
2018年對大部分人來說是蕭條的一年,我在此祝愿大家2019年紅紅火火骨田,升職加薪耿导!
不知道還有沒有人記得前一篇 打造一個通用的 RecyclerView Adapter,這個版本算是比較初級的态贤,因此也沒有上傳到倉庫舱呻,經(jīng)過自己一年來的使用,不斷完善悠汽,終于推出 2.0 版本了箱吕,并且也上傳了 JitPack 倉庫,下面我就來介紹一下這個 2.0 版本有什么不同吧柿冲。
使用
Gradle
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.wangchenyan:radapter:2.0'
}
混淆
該庫已經(jīng)默認(rèn)添加了混淆配置茬高,使用 AAR 依賴是不需要特殊處理的,如果使用 Jar 依賴假抄,需要手動添加以下配置
-keepclassmembers class * extends me.wcy.radapter.RViewHolder {
public <init>(android.view.View);
}
介紹
原始的使用 Recycler View 的方式我就不贅述了怎栽,總之是比較繁瑣的,我直接介紹 radapter 如何使用宿饱。
對于多種類型的列表熏瞄,我們一般是根據(jù) getItemViewType()
區(qū)分類型,來構(gòu)造谬以、渲染視圖强饮,這種繁瑣的方式大家應(yīng)該已經(jīng)寫得要吐了吧,反正我是不想再寫了为黎。
radapter 就是來解救你的邮丰,它可以讓你丟棄 Adapter行您,丟棄多類型時繁瑣的邏輯,只需要保留有用的部分柠座,即 ViewHolder,使 ViewHolder 可以專注于處理自己的業(yè)務(wù)片橡。
來看一個栗子妈经,一個圖文混合的列表
// 首先,添加數(shù)據(jù)捧书,Image 保存了圖片資源ID吹泡,Text 保存了文本
val dataList = mutableListOf<Any>()
dataList.add(Image(R.mipmap.image1))
dataList.add(Text("淵虹"))
dataList.add(Image(R.mipmap.image2))
dataList.add(Text("鯊齒"))
dataList.add(Image(R.mipmap.image3))
dataList.add(Text("干將莫邪"))
dataList.add(Image(R.mipmap.image4))
dataList.add(Text("墨眉"))
// 使用 radapter,注冊數(shù)據(jù)和 ViewHolder
val adapter = RAdapter(dataList)
adapter.register(Image::class.java, ImageViewHolder::class.java)
adapter.register(Text::class.java, TextViewHolder::class.java)
// 設(shè)置 adapter
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = adapter
使用就這么簡單经瓷,你只需要實現(xiàn) ViewHolder 即可爆哑,看下 ViewHolder 的實現(xiàn)
@RLayout(R.layout.view_holder_image)
class ImageViewHolder(itemView: View) : RViewHolder<Image>(itemView) {
override fun refresh() {
itemView.image.setImageResource(data().resId)
}
}
繼承 RViewHolder
,復(fù)寫 refresh
方法刷新視圖即可舆吮,可以使用父類的方法和變量
方法/變量 | 返回值/類型 | 備注 |
---|---|---|
context | Context | 上下文 |
adapter() | RAdapter | 適配器 |
data() | T | 泛型數(shù)據(jù) |
position() | int | 當(dāng)前位置揭朝,調(diào)用 adapter 的 notifyItemInserted 或 notifyItemRemoved 后會自動更新位置 |
getExtra(key: Int) | Any | 可以取得 adapter.putExtra() 存放的數(shù)據(jù),下文會介紹 |
這些方法/變量應(yīng)該足夠我們使用了色冀。
看下效果
到現(xiàn)在潭袱,我們可以根據(jù)數(shù)據(jù)類型區(qū)分不同的 ViewHolder,但有時候同一種類型的數(shù)據(jù)锋恬,可能根據(jù)不同的屬性屯换,也要展示不同的 ViewHolder,怎么辦呢与学?
我們把栗子稍微改一下彤悔,還是圖文混合,現(xiàn)在可以設(shè)置文本的樣式索守,樣式不同要使用不同的 ViewHolder晕窑,看一下如何實現(xiàn)
// 我們給 Text 加上 style 屬性
val dataList = mutableListOf<Any>()
dataList.add(Image(R.mipmap.image1))
dataList.add(Text("淵虹", 2))
dataList.add(Image(R.mipmap.image2))
dataList.add(Text("鯊齒", 1))
dataList.add(Image(R.mipmap.image3))
dataList.add(Text("干將莫邪", 2))
dataList.add(Image(R.mipmap.image4))
dataList.add(Text("墨眉", 1))
val adapter = RAdapter(dataList)
adapter.register(Image::class.java, ImageViewHolder::class.java)
// 注冊 Text 時使用 RConverter,根據(jù) Text 的屬性卵佛,使用不同的 ViewHolder
adapter.register(Text::class.java, object : RConverter<Text>() {
override fun convert(data: Text): RViewHolderWrap<Text> {
return when (data.style) {
1 -> RViewHolderWrap(TextViewHolder1::class.java)
2 -> RViewHolderWrap(TextViewHolder2::class.java)
else -> RViewHolderWrap(TextViewHolder2::class.java)
}
}
})
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = adapter
仍然很簡單幕屹,看下效果
看了 ViewHolder 的代碼,我們知道级遭,ViewHolder 和 layout 通過注解的方式綁定望拖,但是有些同學(xué)說我想在 library 里面使用怎么辦,我們知道挫鸽,library 里面注解不能直接引用 R 文件里面的常量说敏,這個也很簡單,注冊時使用重載方法即可
adapter.register(Image::class.java, ImageViewHolder::class.java, R.layout.view_holder_image)
adapter.register(Text::class.java, object : RConverter<Text>() {
override fun convert(data: Text): RViewHolderWrap<Text> {
return when (data.style) {
1 -> RViewHolderWrap(TextViewHolder2::class.java)
2 -> RViewHolderWrap(TextViewHolder1::class.java, R.layout.view_holder_text_1)
else -> RViewHolderWrap(TextViewHolder1::class.java, R.layout.view_holder_text_1)
}
}
})
有時丢郊,我們想在 ViewHolder 里面使用 Activity/Fragment 里面的數(shù)據(jù)盔沫,這是比較麻煩的医咨,這里我們也考慮到了
// Activity
adapter.putExtra(100, "any extra")
// ViewHolder
可以取得 adapter.putExtra() 存放的數(shù)據(jù)
val extra = adapter().getExtra(100)
是不是方便了許多。
代碼
總結(jié)
大家在使用中有什么問題或建議架诞,歡迎提 Issues