曾经我也是个菜鸟,曾经我也是从网上搜来别人的博客的内容来解决问题,做的项目,很多都来自开源的项目,如果没有这么多热情的无私的人奉献自己的知识,软件业也不会有这么大这么快的进步,今天我虽不能贡献太多的力量,但是希望我的绵薄之力能对需要的人有所帮助。
重构osc的代码的原因是,我本来想做一个客户端,借用一下osc的框架,结果发现很难、很复杂,于是我开始了重构,希望这个重构的版本能给快速开发基础界面起到基础性作用,作为一个基础的工程,减少结构上的代码编写,规范结构,腾出精力进行业务逻辑的编写。
下面是示例界面:
为了能读懂这片文章,先介绍几个概念
UML中的【MainHeader】就是下面的界面
UML中【FrameHead】就是下面的界面
说明,这个和下面介绍的RadioFoot,都是动态添加按钮的,所以布局也是支持动态的计算从而充满屏幕的,现在就是一个例子,里面只有两个按钮,全部充满了屏幕。
UML中【RadioFoot】就是下面的界面
对应的UML类图如下
在上次的基础上进一步将osc的代码进行重构,重构了如下方面:
1、将adapter包中的各个类分到了各个模块的包中,尽量使各个包独立,依赖尽量少
2、进一步重构了frame,将上面的导航抽出来形成了类图中的FrameHead
3、每个栏目的头部导航没有任何区别将其写在layout里不符合代码的重用的精神,完全可以抽出,而且避免了增加一个模块就需要增加一个layout。
4、无论是news,question还是tweet总结一下布局都是一样的,一个LinearLayout(表示头部的导航,现在抽象出来的FrameHead)和一个PullToRefreshListView(用于加载列表),完全没有必要创建那么多的布局,所以抽象出来,一是可以减少布局,清晰结构,同时后面可以动态的添加模块,动态的为用户添加功能,做到不同用户的不同界面。关于frameHead(参见UML)也不用像现在这样写framebtn_News_lastest,可以维护一个map,将不同的模块映射到map上,再进一步获取button的引用即可,现在定义例如:
private Button framebtn_News_lastest;
private Button framebtn_News_blog;
private Button framebtn_News_recommend;
具体实现参见代码。
5、 关于 PullToRefreshListView中的lv_footer lv_foot_more lv_foot_progress,不同的模块列表使用的都是同一个,完全没有必要重复的在不同的地方出现相同的代码,所以抽出来放到抽象类BaseFrame中,同时也减少了构造参数的个数,而且重构后,一不影响界面,而不影响功能,三开发者只要继承父类即可不用编写任何代码设置foot,也可以不知道他的存在。
6、不同的模块可以仿照NewsMain编写,后台线程执行的获取内容通过thread开启,处理返回的数据使用handleLvData处理,由于handleLvData在BaseFrame中是抽象方法,所以实现的类中实现了,就很好的避免了原来的if else switch case的问题。
7、framehead中不同模块的按钮在Main中通过一个Map维护,维持引用,当切换界面使frameHead中的按钮不同的时候,就采用remove和将Map中需要的添加进来即可,避免 了对象的重复创建,也可以实现动态导航,避免了重复写layout的问题
8、上次的版本中 head中的 ProgressBar 的显示没有调,这次搞好了,数据加载显示,加载完消失
9、BaseNavBar采用泛型进行抽象,作为了framehead和RadioFoot的父类,这样表明,以后再做类似的无论是Button类的还是RadioButton类型的导航,还是自己定义图片类型的导航,完全可以通用,直接继承模仿实现即可。减轻了开发导航的难度
10、NewsMain作为新闻模块的主要逻辑实现它需要修改主类Main的UI的东西和上下文,所以需要依赖他,需要在加载数据的时候显示MainHead中的进度条,所以需要依赖他,当点击FrameHead中的按钮例如【最新资讯】的时候需要更新列表中的数据,列表数据更新的行为应该属于新闻模块自己,所以放到了NewsMain中,就在NewsMain中定义了事件点击事件,但是发现点击事件必须要修改被点击按钮的状态,那么这样就会导致NewsMain中需要有FrameHead的引用了,这样就乱了,点击按钮更新自己,应该是自己的行为,至于需要修改别处的数据,那这个就又是别处自己的事了,这个就是自扫门前雪了,所以NewsMain从逻辑分析上是不需要持有FrameMain中的引用的,所以最后改成了FrameHead按钮自己更新自己状态,点击【最新资讯】新闻自己处理自己的数据,这样就比较好了,减少了依赖。具体实现参考代码。
备注:
红薯,大哥我从来没有用过代码分享,他总是提示我比较晚了洗洗睡吧,我确实困了,提交代码还要片段啊,打包的上传不了啊,晕了,没找到,还是放到别处大家下载吧,大家请见谅,不是有意的。
下载地址:
http://download.csdn.net/detail/zyq_1/5638071