-
背景:
因为我们的应用中有很多业务查询的功能,包括但不限于融资申请列表,放款列表申请,银行账户审核等等10来个列表,而针对每一个列表,都有各自一套搜索条件,而且这些搜索条件又各不相同。
一开始的时候,是直接用XML+PopupWindow开发的,但是随着列表越做越多,XML越写越多,逐渐就看着很冗余,很不爽。而且需要重复写很多样板代码进行点击事件的监听和文本内容的获取。 -
实现过程:
后面我在研究一个TabLayout的三方SDK的时候,发现他是通过addView的方式动态添加TabLayout的item,我发现这种方式很灵活,不需要维护那么多的xml,只需要维护几个item的样式,就可以进行复用。
所以,我就参考这种思路,通过装饰者模式封装了一个FilterPopupWindow,内部包含了一个PopupWindow和一个Map,Map里面的一个key-value对应着一个搜索条件实例,这些实例是在Activity或者Fragment初始化的时候,创建进去的。 -
收益:
1. 不再需要维护很多个xml文件,在一定程序上减少了apk的体积
2. 因为Android会对解析过的xml进行缓存(loadXmlResourceParser),对构造函数也会缓存,避免频繁的读写文件,所以这种动态addView的方式,会比直接inflatLayout的xml性能会更加好一些。
3. 通过封装这些查询条件,可以少写很多样板代码,并且在后续的维护中会更加容易和集中一些。
4. 因为需求中需要标识出是否进行了条件筛选,所以现在只需要通过遍历map的方式,来判断是否有筛选条件。不用定义一大堆变量来判断是否有筛选条件。 -
遇到的困难:
1. 一开始是想直接通过一个List将筛选框的每个View都存起来,然后通过index去获取对应的View,但是后面使用起来发现有问题,一个是系统已经帮我们将View存起来了,我们再存一份副本,就会很浪费内存。另外就是使用List如果使用的不规范容易产生越界问题。所以后面就将List改为了Map,key是筛选条件的名称,value是一个保存了View相关信息的实例。
网友评论