你可能不知道的在RecyclerView中實(shí)現(xiàn)局部刷新的技巧

寫在前面

在上一年的時(shí)候我曾經(jīng)寫了一篇<<在RecyclerView中實(shí)現(xiàn)定點(diǎn)刷新>>的文章介紹了如何使用DataBinding框架進(jìn)行局部刷新氛改。時(shí)隔將近一年叁执,期間我也換了一份工作捶码,在新公司里并沒有使用到DataBinding递瑰,所以如果想進(jìn)行局部刷新ui破停,可能需要使用較早的adapter.notifyItemChanged(pos)陷嘴。

近期在做一個(gè)功能的時(shí)候,發(fā)現(xiàn)有一個(gè)比較簡(jiǎn)便可行的方法摔竿,可以達(dá)到局部刷新的效果。

那么方法是什么呢少孝?

其實(shí)思考??一下继低,如果要更新一個(gè)TextView的文本,需要怎么做呢稍走?

答案非常簡(jiǎn)單:那就是找到這個(gè)TextView袁翁,然后調(diào)用它的setText方法。

代碼的話婿脸,可能是這樣 :

findViewById<TexView>(R.id.titleTv).text = "title"

上面的是指普通的View粱胜,那么在RecyclerView呢?

其實(shí)答案差不多狐树,我們只需要找到對(duì)應(yīng)的ItemView或者它的ViewHolder焙压,然后調(diào)用對(duì)應(yīng)的渲染ui的方法就行了。先看看效果:

image

那應(yīng)該怎么做呢?

一個(gè)簡(jiǎn)單的方法

其實(shí)RecyclerView已經(jīng)提供了根據(jù)position獲取ViewHolder這個(gè)功能涯曲。

image

從方法里可以看到RecyclerView會(huì)for循環(huán)去找holder,然后比較位置野哭,如果不為null,且沒有被移除幻件,那么代表可以找到了拨黔,反之則為null。

那怎么找呢绰沥?

其中childCount是通過 this.mChildHelper.getUnfilteredChildCount()得到的篱蝇。

其最終會(huì)調(diào)用RecyclerView的getChildCount()方法,返回的結(jié)果表示可見的item個(gè)數(shù)徽曲。比如當(dāng)前可見的是8個(gè)零截,那么childCount即是8,所以你想獲取超過屏幕最大Index的ViewHoler疟位,那么就會(huì)返回null瞻润。比如當(dāng)前最大可見的position為13,如果你想找第11個(gè)甜刻,能夠獲取到绍撞,但是找第15個(gè),那么會(huì)返回null得院。

image

接著我們來拆解獲取ViewHolder的方法傻铣,如下所示:

 getChildViewHolderInt(this.mChildHelper.getUnfilteredChildAt(i));

首先會(huì)通過getUnfilteredChildAt獲取到index對(duì)應(yīng)的view。這個(gè)方法最后也是調(diào)用的RecyclerView的getChildAt(offset)方法祥绞。

image

找到View之后非洲,再用getChildViewHolderInt(view)獲取對(duì)應(yīng)的ViewHolder,其內(nèi)部實(shí)現(xiàn)如下:

image

即通過LayoutParams獲取到相應(yīng)的ViewHolder蜕径。

而將ViewHolder賦值給LayoutParams的過程出現(xiàn)在RecyclerView的getViewForPosition(pos)方法中两踏,最終會(huì)被LayoutManager調(diào)用。

回到主題兜喻,現(xiàn)在我們獲取到了想要的ViewHoler梦染,而且也知道了當(dāng)前的Position,那么只需要再調(diào)用Adapter的

onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)即可朴皆。

image

當(dāng)然因?yàn)樵贏dapter中也能獲取到RecyclerView帕识,所以可以將更新的方法放入到Adapter中。

image

數(shù)據(jù)變化的時(shí)候遂铡,調(diào)用notifyItemUpdate(pos:Int)即可肮疗,可以說是很簡(jiǎn)單了。

寫在后面

如果要說再優(yōu)化的話扒接,當(dāng)然也有繼續(xù)優(yōu)化的點(diǎn)伪货,比如減少無用的更新们衙,或者說能在子線程通知更新UI,當(dāng)然這些都是后話超歌,以后再來完善砍艾。

GitHub示例:https://github.com/ditclear/BindingListAdapter

==================== 分割線 ======================

如果你想了解更多關(guān)于MVVM、Flutter巍举、響應(yīng)式編程方面的知識(shí)脆荷,歡迎關(guān)注我。

你可以在以下地方找到我:

簡(jiǎn)書:http://www.reibang.com/u/117f1cf0c556

掘金:https://juejin.im/user/582d601d2e958a0069bbe687

Github: https://github.com/ditclear

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懊悯,一起剝皮案震驚了整個(gè)濱河市蜓谋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炭分,老刑警劉巖桃焕,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捧毛,居然都是意外死亡观堂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門呀忧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來师痕,“玉大人,你說我怎么就攤上這事而账∫确兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵泞辐,是天一觀的道長(zhǎng)笔横。 經(jīng)常有香客問我,道長(zhǎng)咐吼,這世上最難降的妖魔是什么吹缔? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锯茄,結(jié)果婚禮上涛菠,老公的妹妹穿的比我還像新娘。我一直安慰自己撇吞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布礁叔。 她就那樣靜靜地躺著牍颈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅关。 梳的紋絲不亂的頭發(fā)上煮岁,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天讥蔽,我揣著相機(jī)與錄音,去河邊找鬼画机。 笑死冶伞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的步氏。 我是一名探鬼主播响禽,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荚醒!你這毒婦竟也來了芋类?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤界阁,失蹤者是張志新(化名)和其女友劉穎侯繁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泡躯,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮竟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了较剃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咕别。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖重付,靈堂內(nèi)的尸體忽然破棺而出顷级,到底是詐尸還是另有隱情,我是刑警寧澤确垫,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布弓颈,位于F島的核電站,受9級(jí)特大地震影響删掀,放射性物質(zhì)發(fā)生泄漏翔冀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一披泪、第九天 我趴在偏房一處隱蔽的房頂上張望纤子。 院中可真熱鬧,春花似錦款票、人聲如沸控硼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卡乾。三九已至,卻和暖如春缚够,著一層夾襖步出監(jiān)牢的瞬間幔妨,已是汗流浹背鹦赎。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留误堡,地道東北人古话。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锁施,于是被迫代替她去往敵國(guó)和親陪踩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 這篇文章分三個(gè)部分沾谜,簡(jiǎn)單跟大家講一下 RecyclerView 的常用方法與奇葩用法膊毁;工作原理與ListView比...
    LucasAdam閱讀 4,391評(píng)論 0 27
  • 上一篇文章分析RecyclerView刷新機(jī)制知道LayoutManager在布局子View時(shí)會(huì)向Recycler...
    susion噠噠閱讀 17,237評(píng)論 13 45
  • 前情回顧 Android RecycleView輕松實(shí)現(xiàn)下拉刷新、加載更多 Android RecyclerVie...
    lovejjfg閱讀 6,982評(píng)論 1 14
  • 生活本來就不容易,而我們的不努力只會(huì)讓生活變得更加無賴 前幾天依據(jù)《Android群英傳》的學(xué)習(xí)寫了一篇筆記是關(guān)于...
    AmatorLee閱讀 3,746評(píng)論 7 23
  • 青松瘦竹笑語微基跑, 木葉寒云帶聲飛婚温。 多情最是風(fēng)霜雪, 惟將暗香誘春歸媳否。
    慕愚堂閱讀 3,846評(píng)論 75 211