打造一個通用的 RecyclerView Adapter(二)

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 的 notifyItemInsertednotifyItemRemoved 后會自動更新位置
getExtra(key: Int) Any 可以取得 adapter.putExtra() 存放的數(shù)據(jù),下文會介紹

這些方法/變量應(yīng)該足夠我們使用了色冀。

看下效果

image

到現(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

仍然很簡單幕屹,看下效果

image

看了 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)

是不是方便了許多。

代碼

radapter

總結(jié)

大家在使用中有什么問題或建議架诞,歡迎提 Issues

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拟淮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谴忧,更是在濱河造成了極大的恐慌很泊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沾谓,死亡現(xiàn)場離奇詭異委造,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)均驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門昏兆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妇穴,你說我怎么就攤上這事爬虱。” “怎么了腾它?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵饮潦,是天一觀的道長。 經(jīng)常有香客問我携狭,道長继蜡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任逛腿,我火速辦了婚禮稀并,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘单默。我一直安慰自己碘举,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布搁廓。 她就那樣靜靜地躺著引颈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪境蜕。 梳的紋絲不亂的頭發(fā)上蝙场,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音粱年,去河邊找鬼售滤。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的完箩。 我是一名探鬼主播赐俗,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弊知!你這毒婦竟也來了阻逮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤秩彤,失蹤者是張志新(化名)和其女友劉穎叔扼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呐舔,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年慷蠕,在試婚紗的時候發(fā)現(xiàn)自己被綠了珊拼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡流炕,死狀恐怖澎现,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情每辟,我是刑警寧澤剑辫,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站渠欺,受9級特大地震影響妹蔽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挠将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一胳岂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舔稀,春花似錦乳丰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夜郁,卻和暖如春什燕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竞端。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工秋冰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婶熬。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓剑勾,卻偏偏與公主長得像埃撵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虽另,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容