Yasha(夜叉) - 基于Kotlin的現(xiàn)代化RecyclerView渲染武器

Yasha (夜叉)

物品介紹:

基于Kotlin的現(xiàn)代化RecyclerView渲染武器

物品特點(diǎn):

  • 無(wú)需Adapter
  • 無(wú)需ViewHolder
  • 支持初始化數(shù)據(jù)加載
  • 支持?jǐn)?shù)據(jù)分頁(yè)加載
  • 支持MultiViewType
  • 支持Header和Footer
  • 支持DiffUtil
  • 支持Loading State
  • 支持CleanUp, 釋放資源避免內(nèi)存泄漏

First Blood

如何快速渲染一個(gè)RecyclerView病线?還在不厭其煩的寫Adapter,ViewHolder? 快讓夜叉來(lái)拯救你吧:


  //以 **dataSource** 作為數(shù)據(jù)源渲染一個(gè)列表
  recycler_view.linear(dataSource) {

      //渲染一個(gè)NormalItem類型的Item
      renderItem<NormalItem> {
          //布局文件
          res(R.layout.view_holder_normal)

          //綁定數(shù)據(jù) 
          onBind {
              tv_normal_content.text = data.toString()
          }
      }

      //渲染一個(gè)HeaderItem類型的頭布局
      renderItem<HeaderItem> {
          //布局文件
          res(R.layout.view_holder_header)

          //綁定數(shù)據(jù)
          onBind {
              tv_header_content.text = data.toString()
          }
      }

      //渲染一個(gè)FooterItem類型的尾部
      renderItem<FooterItem> {

          //布局文件
          res(R.layout.view_holder_footer)

          //綁定數(shù)據(jù)
          onBind {
              tv_footer_content.text = data.toString()
          }
      }
  }

如你所見(jiàn)绑莺,非常簡(jiǎn)單并且直觀惕耕,并且沒(méi)有看到任何的Adapter以及ViewHolder,裝備夜叉欺缘,去Gank吧谚殊!

Double Kill

渲染搞定了,數(shù)據(jù)源從何而來(lái)呢丛肢?夜叉貼心的為你準(zhǔn)備了它的好伙伴:散華

散華是另一件強(qiáng)大的武器摔踱,它能提供夜叉所需要的任何數(shù)據(jù)怨愤,有了它夜叉才能如魚(yú)得水,就像在Dota中它倆也是形影不離篮愉,熟悉Dota的朋友都知道差导,夜叉+散華=暗夜對(duì)劍,所以這里也是一樣设褐,有了它們倆助析,何懼任何逆風(fēng)局?

//創(chuàng)建一個(gè)DataSource
class DemoDataSource : YashaDataSource() {
   
    //loadInitial負(fù)責(zé)加載列表初始化數(shù)據(jù)
    override fun loadInitial(loadCallback: LoadCallback<YashaItem>) {
        
        //模擬延時(shí)寡键,不用擔(dān)心雪隧,該方法會(huì)在異步線程中執(zhí)行脑沿,因此你可以放心在這里進(jìn)行網(wǎng)絡(luò)請(qǐng)求或者數(shù)據(jù)庫(kù)加載等等
        Thread.sleep(1500)

        val allDataList = mutableListOf<YashaItem>()

        //添加Header數(shù)據(jù)
        for (i in 0 until 2) {
            allDataList.add(HeaderItem(i))
        }
        //添加Item數(shù)據(jù)
        for (i in 0 until 10) {
            allDataList.add(NormalItem(i))
        }
        //添加Footer數(shù)據(jù)
        for (i in 0 until 2) {
            allDataList.add(FooterItem(i))
        }

        //通知數(shù)據(jù)加載完畢
        loadCallback.setResult(allDataList)
    }

    //loadAfter負(fù)責(zé)加載下一頁(yè)數(shù)據(jù),夜叉會(huì)自己決定是否觸發(fā)了分頁(yè)加載注服,你只需要做好加載下一頁(yè)的邏輯,其他的交給夜叉吧
    override fun loadAfter(loadCallback: LoadCallback<YashaItem>) {
       
        //當(dāng)加載失敗:
        if (page % 3 == 0) {

            //當(dāng)數(shù)據(jù)加載失敗時(shí)可很,只需要簡(jiǎn)單告訴夜叉一個(gè)NULL值我抠,夜叉就會(huì)自動(dòng)停止加載,并顯示一個(gè)加載失敗的狀態(tài)
            loadCallback.setResult(null)
            return
        }

        //當(dāng)加載完畢:
        if(page == 5) {
            //當(dāng)數(shù)據(jù)加載完之后菜拓,只需要告訴夜叉一個(gè)空列表纳鼎,夜叉就會(huì)自動(dòng)停止加載裳凸,并且顯示一個(gè)加載完畢的狀態(tài)
            loadCallback.setResult(emptyList())
            return
        }

        //加載下一頁(yè)數(shù)據(jù):
        val items = mutableListOf<YashaItem>()
        for (i in page * 10 until (page + 1) * 10) {
            items.add(NormalItem(i))
        }

        loadCallback.setResult(items)
    }
}

是不是很輕松?沒(méi)錯(cuò)逗宁,夜叉和散華提供的API簡(jiǎn)單易懂瞎颗,無(wú)需任何門檻即可快速上手捌议,簡(jiǎn)直是居家旅行禁灼,殺人越貨必備的武器!

除此之外弄捕,散華還提供了很多直接操作數(shù)據(jù)源的API守谓,例如

//Headers
fun addHeader(t: T, position: Int = -1, delay: Boolean = false)
fun addHeaders(list: List<T>, position: Int = -1, delay: Boolean = false) 
fun removeHeader(t: T, delay: Boolean = false) 
fun setHeader(old: T, new: T, delay: Boolean = false)
fun getHeader(position: Int): T
fun clearHeader(delay: Boolean = false)

//Footers
fun addFooter(t: T, position: Int = -1, delay: Boolean = false)
fun addFooters(list: List<T>, position: Int = -1, delay: Boolean = false) 
fun removeFooter(t: T, delay: Boolean = false) 
fun setFooter(old: T, new: T, delay: Boolean = false)
fun getFooter(position: Int): T
fun clearFooter(delay: Boolean = false)

//Items
fun addItem(t: T, position: Int = -1, delay: Boolean = false)
fun addItems(list: List<T>, position: Int = -1, delay: Boolean = false) 
fun removeItem(t: T, delay: Boolean = false) 
fun setItem(old: T, new: T, delay: Boolean = false)
fun getItem(position: Int): T
fun clearItem(delay: Boolean = false)

//等等API接口

Triple Kill

除此之外斋荞,夜叉還貼心的為各位小哥們準(zhǔn)備了狀態(tài)的顯示,如常用的加載中凤优,加載失敗筑辨,加載完成

那如果對(duì)自帶的狀態(tài)有任何不滿,那很簡(jiǎn)單暮现,第一種辦法就是干掉它楚昭,第二種辦法就是替換它

//干掉它:
class DemoDataSource : YashaDataSource() {

    override fun onStateChanged(newState: Int) {
        //super.onStateChanged(newState)
        //只需要重新這個(gè)方法并且注釋掉super的調(diào)用即可抚太,這樣就沒(méi)有任何狀態(tài)顯示啦!
    }
}

//替換它:
recycler_view.linear(dataSource) {

    //替換成你自己的狀態(tài)渲染方式
    renderItem<YashaStateItem> {
        //新的狀態(tài)布局
        res(R.layout.your_state_view)

        //新的狀態(tài)綁定
        onBind {
            
        }
        gridSpanSize(spanCount)
        staggerFullSpan(true)
    }
}

天輝獲勝晌块,GG

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匆背,一起剝皮案震驚了整個(gè)濱河市钝尸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珍促,老刑警劉巖剩愧,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁卷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芒帕,警方通過(guò)查閱死者的電腦和手機(jī)背蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)带膀,“玉大人垛叨,你說(shuō)我怎么就攤上這事点额≥毫眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辞做。 經(jīng)常有香客問(wèn)我秤茅,道長(zhǎng),這世上最難降的妖魔是什么课幕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任乍惊,我火速辦了婚禮润绎,結(jié)果婚禮上诞挨,老公的妹妹穿的比我還像新娘。我一直安慰自己稼钩,他們只是感情好达罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著抚笔,像睡著了一般侨拦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膨蛮,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天敞葛,我揣著相機(jī)與錄音惹谐,去河邊找鬼驼卖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怎囚,可吹牛的內(nèi)容都是我干的桥胞。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼井誉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颗圣!你這毒婦竟也來(lái)了在岂?” 一聲冷哼從身側(cè)響起蛮寂,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤及老,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后食铐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體僧鲁,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虐呻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寞秃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖春寿,靈堂內(nèi)的尸體忽然破棺而出朗涩,到底是詐尸還是另有隱情,我是刑警寧澤堂淡,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站扒腕,受9級(jí)特大地震影響绢淀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘾腰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费薄。 院中可真熱鬧,春花似錦召廷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眼俊。三九已至,卻和暖如春澎灸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糜颠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工元旬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穆端。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓狡赐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀擂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喷市,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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