言
最近接近年关,公司项目没什么事情做。闲暇之余的时间笼统的做了一个app的框架(虽然我不知道这样算不算是框架)。
我们知道,很多App的界面是非常复杂的,如果按照常规的方法去写layout.xml文件的话,app在控件少的时候没有问题,但是如果控件一旦变多,或者控件之间的嵌套非常复杂的时候,后期维护成本是非常巨大的,第一是代码非常复杂,很难看懂。第二是app加载耗时会增加(有可能出现anr,比如LinearLayout的嵌套加载就比较耗时),第三是app不够灵活,界面都被固定住了。那么基于这样一个需求今天将给出一个解决方案。
——————————————— 手动分割线 ———————————————–
实现
先说一下思路,其实思路还是比较简单的,就是采用ListView中的item加载各种不同的模板,再往模板中填充数据和处理模板中的跳转等各个机制。
根据上面提供思路,现在来分析一下所需的各个类:
1、需要一个listView,作为模板的容器。
2、需要一个BaseView,作为模板的基类,因为模板需要填充数据,因此需要方法setData(),fillData(),跳转支持onItemClick()等,当然如果模板需要支持其他的公共方法也可以写在基类中;
3、需要一个BaseModule,作为模板数据的基类,封装了各个模板需要的数据;
直接上BaseView代码:
package com.xspace.ui.template;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import com.xspace.module.BaseModule;
import com.xspace.ui.jumputils.CategoryUtil;
public abstract class BaseView extends LinearLayout
{
protected int viewCode = 0;
protected Context mContext;
protected BaseModule module;
public BaseView(Context context)
{
super(context);
mContext = context;
}
public BaseView(Context context, @Nullable AttributeSet attrs)
{
super(context, attrs);
mContext = context;
}
protected void onItemClick(BaseModule module)
{
CategoryUtil.jumpByTargetLink(mContext, module, viewCode);
}
public BaseModule getModule()
{
return this.module;
}
public Context getmContext()
{
return this.mContext;
}
public abstract void setData(BaseModule module);
public abstract void fillData(BaseModule module);
public abstract void addTemplateView();
public abstract void reFresh();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
就是这样,以后再新加模板的时候直接继承BaseView就可以。
那么又是如何去实现添加模板呢,其实和我们使用listview添加数据一样。其中listview中的getView方法如下:
@Override
public View getView(int i, View view, ViewGroup viewGroup)
{
if (pageModule == null || pageModule.templateModules == null)
{
return null;
}
BaseView template = TemplateManager.findViewById(context, pageModule.templateModules.get(i).templateId);
if (template == null)
{
return null;
}
template.setData(pageModule.templateModules.get(i));
view = template;
return view;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
千万别看错了findViewById方法,findViewbyId方法如下:
public static BaseView findViewById(Context context, String tempId)
{
if (tempId == null || tempId.equals(""))
{
return null;
}
if (tempId.equals(TemplateConstant.template_index_item))
{
return new TemplateIndexItem(context);
}
else if (tempId.equals(TemplateConstant.template_banner))
{
return new TemplateBanner(context);
}
else if (tempId.equals(TemplateConstant.template_end_banner))
{
return new TemplateEndBanner(context);
}
else if (tempId.equals(TemplateConstant.template_cover))
{
return new TemplateCover(context);
}
else if (tempId.equals(TemplateConstant.template_grid))
{
return new TemplateGrid(context);
}
else if (tempId.equals(TemplateConstant.template_grid_2))
{
return new TemplateGrid2(context);
}
else if (tempId.equals(TemplateConstant.template_grid_3))
{
return new TemplateGrid3(context);
}
return null;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
其中new TemplateXXX() 就是模板。这样就可以加入到item了哦。
当然数据类就不在这里说明了,给大家看一组数据格式:
{
"templateId": "template_cover",
"img_url": "http://img.kaiyanapp.com/0bf15aca2a5a3d371d04275c2b208e2a.png?imageMogr2/quality/60/format/jpg",
"title": "精选图集0",
"subtitle": "#搞笑#全能搞笑集锦",
"description": "首先要明确1个概念,在android上,“沉浸式”叫沉浸式全屏模式以及透明化系统状态栏其实这个也没啥好说的,不管你是android粉还是IOS粉,在日常玩机的过程中,都见过这种界面效果0",
"errorCode": 0
},
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
总结
写到现在我都觉得我自己看不懂,具体大家还是去GitHub下载下来看,绝非打广告骗流量。
差点就忘了附图了,我也才写了几组模板。凑合看吧。
--------------------- 本文来自 jixiongxu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jixiongxu/article/details/79047951?utm_source=copy