RecyclerView使用封装与优化

   最近优化了项目里的列表展示,顺便对RecyclerView的使用做了重新的封装,目的是当列表的需求比较复杂的时候,依然能够保持逻辑的清晰和解耦,同时通过封装来使复杂列表的性能得到一定的保证。

当然如果是非常简单的列表的话,其实Android原生的RecyclerView加上Adapter就已经比较便捷了,没有必要去做过度的封装了。

项目GitHub地址: https://github.com/zhengcx/InstantRecyclerView

   每一个对项目的重构或者重新封装都是出于对现状的不满,那么我们就从这个封装项目解决了哪些问题来展开这篇博文吧。

1.解决重复的全局刷新

   需要注意一下你的项目里对列表的使用,特别是加载更多时是否都是重复的全局刷新,这对复杂列表的性能影响较大,你需要考虑每次刷新不去刷新那些不需要刷新的item,一个是对性能会有提高,另一个页面上用户的体验也会好很多,本项目提供了全局刷新和增量刷新的相关方法,保证加载更多或者操作单个item时只局部刷新。

2.解决header/Footer的增删效率

   RecyclerView本身并没有提供像ListView那样便捷的添加header/footer的方法,所以需要我们自己去实现。

网上主要有两种:一种是采用wrap的方式使header、footer和普通item区别开,而另一种方式使把header、footer也当做是一种itemType来做。

   这里我们采用了第二种方式,提供了便捷添加header/footer的方法,当然把header\footer当做一种itemType来看待,则当header/footer发生增删(特别是header)时,则会使列表发生全局的刷新,这里优化的点是对RecyclerView来说他的header永远只有一个,是一个ViewGroup,之后要添加或者删除一个或多个header,都只是往这个ViewGroup里增删View,将不会对整个列表产生刷新,提供性能和体验。

3. 解决列表多itemType时代码不够清晰的问题

   当你的列表会存在多种复杂的itemType时,很容易时Adapter里的代码产生混乱,且不够清晰,很难拓展。我们封装的目的是:
1.让每种itemType的处理逻辑交给各自的itemDelegate去处理,实现不同itemType处理逻辑的解耦

2.让代码易于拓展,也就是说不管今后要再添加多少种itemType,都能做到非常清晰,非常便捷。

项目里通过DelegateScheduler来管理调度不同itemType的处理逻辑,使多itemType变得清晰易拓展。

4.解决状态View导致过度绘制的问题

   我们的列表通常都需要好几种显示加载状态的View,比如loadingView、加载失败View、加载数据为空View。如果你的做法是在布局文件里先写好这几种View然后通过设置是否可见来控制,显然这会引起布局嵌套过渡绘制的问题,当然你可以利用ViewStub来做一些优化,但是治标不治本,当这些状态View被inflate一次后,依然会存在这种问题。

   如果你把这些状态View也当做是一种itemType呢,让它与普通item一样参与回收,参与cache,是不是就可以解决这个问题,这是我目前看到想到的比较理想的方式,当然可能有更好的方式。

5.解决上拉加载更多问题

   显然如果你把上拉加载更多这个功能放在你的业务代码里去监听是不合适的,我们需要封装一下,让recyclerView自动就带有这个功能,直接使用就可以了。

   本项目给上拉加载更多提供了两种不同的监听方式,看个人喜好自己选择。
1.实时监听,也就是说只要用户滑动,那么就会实时监听判断要不要开始加载下一页数据,这一种的好处是让列表预加载更加实时,基本可以实时用户可以不断的下拉,使用户感知不到我们的加载过程。

2.另一种是只有当列表滚动状态发生改变时才会发起是否加载下一页数据的判断,这一种基本是用户从滑动到停止时才会发起下一页的加载。

当然两种方式提前多少个item发起预加载下一页都是可以由你自己来设置这个参数,目前默认是采用第二种方式,可以通过设置来使用第一种方式。

6. 解决item的点击事件重复绑定的问题

   RecyclerView没有像ListView那样提供setOnItemCLickListener()方法来绑定item的点击事件,所以我们一般都会自己去设置这个item的点击事件,这样子很容易就把点击事件多次重复设置了。

   这里封装提供了setOnItemClickListener()方法,让你可以放心的设置item点击事件,并且在回调里提供该item所绑定的数据,以及item的position,该item的类型等重要信息,可以使你在多种itemType的列表里的点击事件里正确的做各种你想做的事情。

对列表性能问题的建议

   其实对于一些复杂的列表,性能问题显得尤为重要,上面说了一个是尽量去做局部刷新而不是全量刷新,一个是尽量减少过度绘制。还有一个非常重要的是每个版本都要去关注你的bindViewHolder()里的逻辑是否有耗时严重的方法或操作,列表性能出现问题,很大概率就是你的bindViewHolder()中有叫耗时操作,排查也很好排查,通过SysTrace+TraceView可以很快找到耗时的方法和性能的瓶颈,然后做针对性的优化就可以了。

项目GitHub地址: https://github.com/zhengcx/InstantRecyclerView

最后,希望世界上的每一个列表都丝丝如滑~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 周围的一切如此熟悉而又陌生,耳际的所有声响似乎都细致起来,我知道,阖了双眼,必定会在点头转颈里找见那份舒坦,是的,...
    聆听松风1阅读 259评论 3 2
  • 昨天我们看到呼兰河传的孩子为了争抢麻花,被站在大太阳下面。还有卖豆腐的一出门大家都眼馋着,但还是不去买。只要一买了...
    许之欢喜阅读 1,231评论 0 0
  • 要说此次三亚之行最感动100位乡村教师的是谁?答案肯定是马云公益基金会的各位小伙伴。他们的贴心陪伴,时时处处都在。...
    山西长治刘焕芬阅读 477评论 0 0