EmptyLayout:界面多状态加载

需求

在项目开发的过程中,需要对Api的数据的不同情况反映到UI界面上,以达到良好的用户体验,Api的数据的状态大致可分为异步请求数据、正常返回数据、空数据、加载失败、网络错误等一些状态,相应的布局状态也可分为加载中、正常显示、无数据、加载出错等状态,于是就有了对多状态布局进行管理的需求。

在早期这个需求刚被提出来的时候,最开始的做法是使用FrameLayout或LinearLayout布局里面嵌套对应状态的xml布局,在各种状态布局切换时,需要在Activity或Fragment里使用java代码频繁的调用各种view的显示与隐藏(小白的做法),最后这样做出来造成代码臃肿,操作繁琐,而且不可复用,最后不得不重构,于是就有了EmptyLayout多状态布局。

 父容器的选择

基于布局特点、扩展性、性能方面考虑,RelativeLayout由于在 layout 时需要 measure 两次被忽略,LinearLayout也可以作为父布局,不过FrameLayout的层次的特性更适合,比如在空布局状态时需要在顶部显示另外的view的情况下,如下图所示


empty.jpg

定义过程

首先为各种布局状态定义标志位

代码.jpg

接着在 attrs.xml 中定义自定义属性,用于配置在不同状态页的默认属性xml然后在初始化的时候通过 TypedArray 进行赋值

类内部维护一个View的List 的集合,为非正常布局各定义一个Tag

代码.jpg

重写FrameLayout的  addView 方法把非正常布局过滤

代码.jpg

然后在切换布局时把Tag设置到对应的View,比如`setErrorView

代码.jpg

最后在对外开放一个接口,提供错误重试的回调

代码.jpg

这样一来就把各个布局状态的切换操作封装到自定义组合的Layout中了,只需要对外开放api就行了

代码.jpg

其中的skipId是上图中需要在空数据状态下显示的view的Id的集合。基于LinearLayout的使用场景比较多,我还实现了LinearEmptyLayout简版多状态切换的Layout,详细的代码以及Sample可以去我的github查看,觉得还可以的不妨Star或follow

 思考

EmptyLayout虽然已经有了很多的应用场景,但是如果你的页面是基于RecyclerView写的,本着避免view嵌套的原则,利用修饰者模式,可以为RecyclerView定义一个EmptyWapper的Adapter,通过Adapter的type控制空页面和错误页面切换。

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

推荐阅读更多精彩内容

  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 1,146评论 1 0
  • ```java /* * Copyright (C) 2006 The Android Open Source P...
    mrganer阅读 1,136评论 0 50
  • Android中View和ViewGroup关系大揭密 1. 概念 Android中的View与我们以前理解的“视...
    所以一直走啊阅读 438评论 0 4
  • 学习笔记:纪念曾经学过的Android,由于负责公司大的方向,向管理方向转型,原先内容一直在有道,为了减少有道笔记...
    后知后觉_95a8阅读 460评论 0 0
  • 大家看看,好不好笑
    蒋欣妘阅读 182评论 1 1