Android ListView中复杂数据流的高效渲染

更新:目前已经写了demo,欢迎讨论:Android复杂数据流的“高效”渲染

我们知道Android中的ListView之所以可以实现item的无限加载,是因为对每个item的View 进行了缓存复用。ListView的高效性能使得其在App开发中使用非常频繁,本文主要分析在复杂数据展示时如何更加高效的使用ListView,如微博、facebook、twitter等的feed流需要展示非常多的数据类型:新闻、图片、网页链接、视频,这种情况下ListView进行需要缓存各种类型的View,App的内存占用急剧升高……

ListView复用原理

1. 简单列表复用

首先简单介绍一下ListView的复用原理,我们知道使用ListView时一般需要结合Adapter使用,继承BaseAdapter时,一般需要实现四个方法:

    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return null;
    }

其中getView是渲染每个Item时进行回调生成View的,方法参数convertView就是ListView传回可以复用的View,当其不为null时,无需重新创建View,可以直接使用convertView,进行数据渲染即可。其原理是当第一次调用时ListView直接将生成的View缓存到一个ArrayList<View>中,当需要时直接从ArrayList中取出即可:

Paste_Image.png

2. 复杂列表复用

当列表中有多种类型的view时,我们需要实现BaseAdapter中的:

    @Override
    //返回view类型数量
    public int getViewTypeCount() {
        return super.getViewTypeCount();
    }

    @Override
    //返回每个Item的类型
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

这种情况下ListView实际为每种类型的Item设置了一个ArrayList进行缓存:

Paste_Image.png

复杂信息流

此处以微博为例:

  • 转发带视频类型


    Paste_Image.png
  • 普通文字+卡片类型
  • 转发图文类型

此外还有原创图文类型,原创视频,原创卡片,系统通知,转发视频,转发图文,……,微博有多达二十种左右的item类型,每种类型中的View可能包括头部图片、文字描述、正文内容、正文图片、正文视频、分享操作栏等内容,这些都缓存到内存中,再加上二十多种类型,想想内存的感受……

优化

我们可以看到很多类型中都有相同可以复用的部分,如头部、分享操作栏等很多item中都是一样,是否可单独拿出来呢,我们进行简单的拆分:

Paste_Image.png

一个Item我们把它拆为来五个部分,首先头部、评论操作栏等可以在很多不同类型的数据Item中进行复用,文字、图片等的View也可以单独进行复用,而且最重要的是:缓存ArrayList中保存的View数量将会减少,内存消耗减了不少

具体实现中的坑

看到这里,是不是很多同学觉得打开了新世界的大门,急着进行代码的优化?具体的代码不方便贴出来,这里说一下具体实现过程中碰到的坑:

  • item click事件
    由于优化的需求,把逻辑上的一个Item拆分为了多个item,因此每个item上都要设置ItemClick事件。具体实现时可以写一个基类,在基类中对item click进行处理。
  • cover 按压效果
    在item 点击时,一般需要有按压效果,此时逻辑上的item已经进行了拆分,需要策略实现逻辑上item的整体按压,而不是只有某个拆分后的item被按压。
  • divider
    我们知道listview的item之间是有divider的,此时需要设置divider为null,我们通过添加item的方式来实现divider效果。

效果

等填完拆分后的坑,运行程序,观察前后的效果,内存占用可以减少10~20m,滑动流畅度也提高不少,在低端手机上的效果尤其明显,掉帧明显减少。非常建议有需要的同学尝试。

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

推荐阅读更多精彩内容