这是一个很微妙的东西,可能平时经常用到,但是没注意,我想对这个内容进行一个总结并提出一些看法,谈的是动态页面,不是动态布局。
一.什么是动态页面
什么是动态页面?我认为是一种在开发时的设计思想,最终展示的页面会随着数据的改变而改变,或者说会根据数据而展示页面。
我的观点是:
页面由数据去决定,我称它为动态页面(主要是我不知道专业术语叫什么)
比如我们经常使用的RecyclerView,我觉得它就是一个动态页面,因为它的展示会随数据的改变而改变,比如说RecyclerView要展示多少条数据,一个Item里面要展示成什么样子的。这些都是由数据去决定的。还有RecyclerView也体现出了动态页面的一个特性,复用性。不管在什么地方都能使用RecyclerView并且还能展示出来不同的效果,而展示出不同效果的原因是因为数据不同。
二.举个例子
比如说,我们经常有这样的操作,我做一个学社区APP,你的首页会根据我是否登录而展示不同的状态,比如说我登录了,这个activity就展示更多内容,我没登录,这个activity就展示较少的内容。
有人会说,这样的需求我们经常做啊。是的,我们经常会有这样的需求,而有些大屌做多了,一拿到这样的需求就能很快的去完成,甚至每次搭页面的时候都会优先考虑动态。而很多新人,比如我这种,没有做多,没这样的概念,做起来会很容易出问题,所以我才想写一个总结以免以后再犯错,为什么大神不写,大神都不屑写这些东西。
再举个栗子。我开发一个多列项选择的模块,比如我们经常会看到这样的功能。
左边一个列表,右边一个列表,如果你把布局写死,那它始终就是两列,而我可以把这样的需求用动态页面去实现,这样的话,我就能很轻易的实现3个列表,4个列表,甚至更多个列表。
先展示一下写的一个小demo吧。
还有一张两列的gif坏掉了,没事,我就只展示多页的吧。我这里写了一个4页的demo
用法很简单
<com.example.kylinarm.multilisttest.MultiListView
android:layout_height="match_parent"
android:layout_width="match_parent"
app:count = "4"
android:id="@+id/mv_content"
>
</com.example.kylinarm.multilisttest.MultiListView>
app:count 是最大展示多少列,默认为两页.
mvContent.setAllWeight(1,1,1);
mvContent.setLayoutManager();
mvContent.setAdapter(mockResult(),this);
第一行是设置每一列的比例,第二行是初始化布局,第三行是设置数据。
这么简单的调用,就能实现一扩展性这么好的动态布局。但是我也总结出了一个规律,虽然调用简单,但是封装的内容很复杂,越是复杂的布局,使用的算法就越复杂。
三.动态布局总结
1.概念
首先希望要有这样的一个概念(讲给自己听),搭建一个模块时,优先考虑去实现动态,如果实在无法实现,再去写静态的。什么叫静态,比如我们(新手)经常做的,把布局写死,这样要你改布局的话你要怎么做,要么加上需要改动后的布局隐藏,但这样也只能适应两种情况啊,多加一种情况你又要改xml布局。要么写两套布局,那如果多加一种情况你又要多写一套布局。这样就每次改需求你都要去动布局。而像我上面写的demo,你要求展示多少列,我就改个数字就行,而且返回多少列的情况我都能适配。
2.写成动态的虽然比静态的更耗时间,但是代码量比静态的多不了多少,而且功能比静态的强大很多。
3.动态页面依赖于数据,页面会根据数据的改变而改变,还有需要适配,你可以把适配想成一种数据与页面对接的逻辑的封装,就像RecyclerView有适配器一样。
4.动态页面需要真正的涉及到数据结构和算法。页面的展示会根据返回数据的结构而定,展示的逻辑也需要相应的算法去实现。
5.总的一句话,动态的东西肯定比静态的牛X,所以不光是页面,很多地方,如果使用动态的思维去开发模块,一定会比静态的功能强大很多。
关于我写的demo我想放到下篇去讲,现在太晚了,也写不了太多东西。