Android如何实现网络获取布局并listview加载不同布局

Android 多状态加载布局的开发 Tips - 简书
Android 多状态加载布局的开发 Tips
作者博客地址:
本文博客地址:
本文将结合自己的项目开发实践,简单分享一下关于多状态 Layout 的开发实践 Tips。
什么是多状态 Layout
对于大多数 App 而言,项目中都有多状态加载 View 这种需求,如下图所示。
对应到开发中,我们通常会开发一个对应的自定义 layout 用于根据页面不同的状态来显示不同的提示 view。
在项目中,我们大多会在开发初期就把这套 layout 框架写好,然后其他人的自己的开发过程中直接使用即可。如下所示:
&name.gudong.MJMultipleStatusLayout
android:layout_width="match_parent"
android:layout_height="match_parent"&
android:id="@+id/lv_activity_center"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
&/name.gudong.MJMultipleStatusLayout&
这篇文章不讨论如何去实现这样的自定义 loading layout,Github 上太多了,这里主要思考、总结在实际开发中开发这样的自定义 Layout 时应该注意那些地方。
但是为了说明方便,这里还是采用的方案简单叙述一下。
为了后文描述方便,这里把这个多状态自定义 Layout 先称为 MultipleStatusLayout。
在实现 MultipleStatusLayout
时,首先选择继承一个 ViewGroup 作为自己的父类,然后默认把内部的第一个子 View 作为 ContentView,其它各种情形下对应要显示的 layout view,根据不同的加载状态,在 MultipleStatusLayout 中通过动态 addView 去控制对应 layout 的加载显示,也可以通过 ViewStub 把不同情形的 layout 进行懒加载,然后对外提供不同的方法,方便外部调用、控制不同状态下的 layout 显示。
嗯,简单说来就是这样,原理很简单,实现起来也没什么技术难度,对于一般的开发人员只要一开始明白具体的产品逻辑和实现思路,相信花不了多少时间就可以完成这样的 MultipleStatusLayout。具体这种方式的实现可以参看一个 的实现。
下面着重列举一下开发 MultipleStatusLayout 过程中的注意点或者要点。
考虑到 MultipleStatusLayout
开发完成后,会在项目中的很多页面中应用,而且很多时候是作为页面顶级父容器而存在,所以开发过程中一定要注意其性能还有稳定性,否则一旦出现问题,整个项目中应用到该 MultipleStatusLayout
的页面都会随之出现问题。
以下就从性能角度、可维护性、稳定性等方面考虑出发,列举一些开发 tip 。
选择最合理的父容器
首先 FrameLayout、RelativeLayout、LinearLayout 都可以作为 MultipleStatusLayout
的父类,抛开现在的应用场景不谈,都知道 RelativeLayout 在 layout 时需要 measure 两次,所以对于一个未来要在很多页面中使用的 Layout ,把 RelativeLayout 作为父类这个方案首先 pass 掉。
但是因为 MultipleStatusLayout 中显示的 view 大都需要居中显示,所以使用 RelativeLayout 相对比较容易控制居中位置,这可能是很多人选择 RelativeLayout
作为父类的初衷。这里自己可以做一下权衡。
关于 LinearLayout 和 FrameLayout,如果按照上一节提到的实现方案,其实都可以采用,不过考虑到该类 Layout 的应用场景,建议选择 FrameLayout。
因为MultipleStatusLayout 未来在大多数情况下是作为页面父容器存在的,既然是父容器,内容可能会有各种变化,这时使用 LinearLayout
这种线性布局就会在布局时显得特别局限,比如一些页面可能需要在 MultipleStatusLayout 之上显示一个 FloatActionButton 或者其他的 view,这时使用 FrameLayout 就会好做很多也会灵活很多。
选择最优的加载 View 方式
如何控制这些多状态对应的 View ? 对于一般的情形,至少有两种 View 类型,一种是加载中的 loading 样式 view,一种是异常状态的 layout view,当然还可能有更多具体的情形。
不同的样式对应一个不同的布局,为了简便我们可以一次性的把所有状态对应的布局都写在一个 layout 布局里,然后可以通过控制隐藏、显示来根据不同的状态来展示不同 view,这是最直接的想法。
但是,只要多思考一步,就会发现这种方式非常不可取。因为很多时候,MultipleStatusLayout 作为一个父容器只关心自己的 ContentView,异常页面和加载页面甚至可能没有机会出现,但是现在这样做就表示,这个页面不论有没有异常或者加载逻辑,你的布局里都会存在对应的 layout 布局代码。这样在界面绘制时就会白白耗掉多余的时间。
而且这个 Layout 后续会在项目很多页面用到,所以这里的布局耗时问题放大后就显得很严重。
鉴于此,取而代之的更好的做法应该是动态去 addView,只有这个页面第一次调用 loading 或者 showError 这样的方法,我才去把对应布局加载进来,当然这里使用 ViewStub 也是一样的效果。
这里也就是说,只有调用了相应的方法,才去加载对应的 layout.
其实这个问题是自己开发公用 Api 普遍面临的问题,由于开发 MultipleStatusLayout 可能会定义一些颜色资源或者背景资源,这里建议所有资源开头使用一个固定的开头,这样可以防止跟主版本中的资源重名。进而早成一些奇怪的 UI 问题或者编译问题。比如按钮的背景你可以定义为 msl_btn_normal 而不是 btn_normal,文字的颜色你可以定义为 msl_text_white 而不是 text_white。这样就可以有效避免一些资源冲突。
更多关于如何开发一个第三方库,可以查看的
提供友好的方法调用方式
既然是提供给大家使用,你就应该在方法命名上多花点心思,最好见名之意,这样大家调用时也会舒服很多。
另外对外提供 Api 时也应该保持克制。不要一下子提供出去太多的方法,不论有用没用,一下子都对外提供,这样会对后续的维护造成隐形的负担,因为提供的公用方法越多,表示你后续都要对这些方法进行维护。
最好的原则就是用到什么提供什么,不要提前设计。
另外,随着项目迭代,对外提供方法的参数可能会变得多起来,比如以前显示错误页面的方法是
void showErrorView(Stirng error)
后来要增加自定义的 icon 或者点击事件响应,这时你就需要扩展方法参数,往往这种参数可能会变得很多不可收拾,这时建议使用 Build 构建模式设计,如下示例所示:
showErrorView(StatusViewConfig config)
调用时就可以这样调用
showErrorView(new StatusViewConfig.StatusViewBuild(getContext())
.icon(icon)
.message(message)
.subMessage(subMessage)
.layoutMode(mLayoutMode)
.withActionText(actionText, clickListener)
良好的文档
当你开发完成后,最好趁热写一份简单明了的使用文档出来,这样大家就可以直接对照文档使用你写的库,不用去关心代码实现,直接调用 Api 就可以完成自己的业务需求,同时也省的自己去面对面跟别人讲怎么使用了。
前段时间在 V 站上看到一个问题,说你们公司使用什么样的文档管理工具?其中有一个回答言简意赅,很有意思,四个字 口口相传。
其实对于任何一个项目都是,有时间写点文档,梳理自己思路的同时方便别人,何乐而不为。
这种 Layout 在项目中会随着项目的更新迭代而不断的更新,所以一开始你就应该知道,后续还要不断迭代更新,所以代码设计实现时应该留意扩展性。
另外,相关的开源方案有很多,建议一开始可以参考一些好的方案,然后结合自己项目的实际需求,来开发维护属于自己项目的一套框架。因为多状态 loading 加载提示框架大都和产品设计强相关,不具备一般的通用性。
下面列举一些自己收集到的多状态加载开源方案,方便对比。
同样功能的 Layout 可能在不同的业务场景下实现方式也会有很大的区别,所以不论哪种实现方式,无所谓好坏,只要适合就好。但是开发此类 Layout 要遵循的基本准则、以及要注意的点应该大都相同,希望此文可以给你一些启示帮助。
本文原创发布于公众号 大侠咕咚,欢迎扫码关注更多原创文章。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用到的组件1、通过CocoaPods安装项目名称项目信息AFNetworking网络请求组件FMDB本地数据库组件SDWebImage多个缩略图缓存组件UICKeyChainStore存放用户账号密码组件Reachability监测网络状态DateTools友好化时间MBP...
发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注
09:45字数 61697阅读 3316评论 2喜欢 85 用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FM...
用到的组件1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好...
我满腔热血 你陌陌桑桑 我天天地地 你昏昏暗暗 蓝天青草牛马 女女緑緑红红 谁谁展开双眼 谁谁日日年年
哈哈哈哈哈哈哈哈哈画了一只小绵羊 绵羊画了好多遍orz 过几天去买勾线笔。。
昨天偶然间发现了简书,惊喜于在我们日常的APP之外,真的有人在营造着文字里的世界,在这里,只要你文章写的好,就能找到志同道合的朋友。于是昨天就把最近的一篇文章发布在这里,渴望找到知己。 我始终觉得文字里是有着另外一个世界的,一千个读者就有一千个哈姆雷特,每个人的感觉都不会相...
转载自【张新强】的博客 看似完美的单例模式? 第一个if (instance == null),其实是为了解决效率问题,只有instance为null的时候,才进入synchronized的代码段——大大减少了几率。 第二个if (instance == null),则是为...正在初始化报价器android动态加载布局的方法哪位清楚?3个回答r你好,android中使用布局是为了加快开发,最终控件还是通过解析XML后,通过代码添加的。 具体方法: 例如你的布局是一个L上面有一本Button btn1; 要删除这个btn1要做的就是 linear.removeView( btn1 ); 动态添加也是一样的...
左以兜2077用XMLHTTP取得要脚本的内容,再创建 Script 对象。 注意:a.js必须用UTF8编码保存,要不会出错。因为服务器与XML使用UTF8编码传送数据。 主页面代码: function GetHttpRequest() { if ( window.XMLHttpRequest ) // Gecko return new XMLHttpRequest() ; else if ( window.ActiveXObject ) // IE return new ActiveXObject("MsXml2.XmlHttp") ; } AjaxPage( "scrA", "b.js" ); alert( "主页面动态加载JS脚本。"); alert( "主页面动态加载a.js并取其中的变量:" + str ); 现在完成了一个JS脚本的动态加载。 希望我的答案可以帮助到你,谢谢!
zaodongjie1//动态添加布局的方法1. LinearLayout ll = (LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null); setContentView(ll); LinearLayout ll2 = (LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,ll); //这样 main2 作为 main1的子布局 加到了 main1的 根节点下
//动态添加布局的方法2 addView. LinearLayout ll = (LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null); setContentView(ll); LinearLayout ll2 = (LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,null); ll.addView(ll2);
热门问答123456789101112131415161718192021222324252627282930相关问答1个回答素颜s38我给你 把分拉高点 我这清单很齐呢2个回答绝甘分少不是。桂林公园在康健园的旁边,不一样的两个公园。1个回答陌凉城北aihttp://www。donlim。com/ 看看是不是这个呢?1个回答鈊梦8023  小熊的2041煮蛋器,可以去网上查查,双层的空间很大。   可以煮蛋,蒸蛋,热馒头方便的,是自动断电的,刷个牙的时间就好了,和老公用很方便。   是从淘宝买的80元包邮,原价是...1个回答胶州张德宝这种尺寸的喷绘20-30的分辨率就行了1个回答hbk1982闪烁的时候 按冲水,然后马上按停止,灯就不闪了,然后下一步,按住停止几秒解锁,用儿童功能冲水,如冲水正常,停止,再按正常冲水,就行了。3个回答长沙房东大王没事,放学买!政府给你撑着的! 不管哪届政府都不希望泡沫在自己手里破灭咯?2个回答棦G263收索中......3个回答操曹遭透明,乳白,黑色,有10毫米的,不过一般的板都不足厚 普通板有3毫米和5毫米的,上面三个颜色的板厚全一点,有15毫米,20毫米的,透明的板厚是最全的
望采纳!2个回答倔佥攒如果不从具体性能比较,只从产品质量,售后服务和用户口碑来说,奥豪斯可能好些吧,它是瑞典梅特勒.托利多的一个下属公司,梅特勒.托利多公司跟赛多利斯公司属于天平做得最好的两个大公司了。豆丁微信公众号
君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
android 动态布局 android 动态添加布局 android 动态加载 android 动态加载jar android 加载布局 android 加载动态库 android分页加载 android 加载图片
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Android 动态加载布局
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 android 加载布局 的文章

 

随机推荐