经过前五篇系列文章,对Tangram和vlayout也有了初步认识,这篇文章开始将结合业务场景使用,探索框架能力能对业务带来的支持,因为调研本身是一个需要不断踩坑的过程,所以大纲也做了微调,后续会根据实际使用过程发现的问题和解决方案进行更新。

  1. 需求背景
  2. Tangram和vlayout介绍
  3. Tangram的使用
  4. vlayout原理
  5. Tangram原理
  6. json模板和数据分离
  7. 待定

本文将对Tangram的json模板和数据进行分离。

笔者Demo代码,内容见demo2包。

数据分离

前面的文章提到过,在实际业务中不太可能把数据绑定在模板里,这样模板会很臃肿,我们要做的是,用模板描述页面结构和数据源,而非数据本身,因此需要将数据剥离出来。

运行效果:

数据mock自玩安卓(看着有点乱,后续有时间搭个小服务,向业务贴近),

重点看页面结构即可,远程模板调整了Card顺序、4列布局改成5列、改了文本颜色和瀑布流item背景色。

然后来看该页面实现ShoppingHomeAct

 public class ShoppingHomeAct extends TangramActivity {ActivityShoppingHomeBinding mBinding;​@Overrideprotected void onCreate(Bundle savedInstanceState) {mBinding = DataBindingUtil.setContentView(this, R.layout.activity_shopping_home);super.onCreate(savedInstanceState);}​@Overrideprotected String createBizDomain() {return "shopping_home";//返回业务域:商城首页}​@Overrideprotected RecyclerView createRecyclerView() {return mBinding.rvList;//返回RecyclerView}​@Overrideprotected boolean needRefreshAndLoadMore() {return true;//开启下拉刷新和加载更多}}

代码很少,只需继承具备Tangram能力的TangramActivity,返回其需要的对象即可。

动态合并数据

参考官方Demo,首先想到的方法是,动态来合并数据,也就是按如下思路,

进行数据准备,

  1. 模板地址:net_shopping_home.json
  2. 聚合数据接口:tangram/shopping/home
  3. 瀑布流数据接口:玩安卓 - article/list/0/json

模板如下(有删减),描述了页面结构和数据源,

 {//聚合数据接口,当然实际业务中不需要写完整路径,如tangram/shopping/home"requestMakeup":"http://rest.apizza.net/mock/3f233eed2d9be716a5f48fccb9c719f2/tangram/shopping/home",//瀑布流数据接口"requestList":"https://www.wanandroid.com/article/list/%s/json",//模板名字"templateName":"net_shopping_home",//页面结构template"template":[{"type":"container-fiveColumn",  //五列布局"load":"makeup:category",  //数据源是聚合接口的category字段"itemType":"ImageTextView",  //具体视图cell是上图下文ImageTextView"style":{"textColor":"#6699ff",  //扩展字段,文本颜色"padding":[9,9,0,9]}},{"type":"container-waterfall",  //瀑布流布局"itemType":"GoodsItemView",  //具体视图cell是商品样式GoodsItemView"load":"xxx",  //不用写,只要配置了requestList,默认最后一个Crad取瀑布流数据"style":{"column":2,  //展示两列"hGap":"4",  //间隙"vGap":"4","margin":[9,9,0,9],"itemBgColor":"#1F1F1F",  //扩展字段,item背景颜色"textColor":"#ffffff"  //扩展字段,文本颜色}}]}

聚合数据如下(有删减),

 {"errorCode":0,"errorMsg":"","data":{"banner":[  //轮播图数据{"imgUrl":"https://wanandroid.com/blogimgs/942a5c62-ca87-4e7c-a93d-41ff59a15ba4.png","link":"https://www.wanandroid.com/navi"},{"imgUrl":"https://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png","link":"https://www.wanandroid.com/blog/show/2"},{"imgUrl":"https://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png","link":"https://flutter.cn/"}],"bottomTitle":[  //瀑布流标题数据{"title":"猜你喜欢"}]}}

一切准备就绪,开始实现TangramActivity,关注主要实现即可。

把聚合数据合并进模板对象的template字段,

 //TangramActivity.javavoid mergeMakeupDataToTemplate(JSONObject data, JSONArray template) throws JSONException {//遍历每一个卡片(布局),把数据填充进字段itemsfor (int i = 0; i < template.length(); i++) {JSONObject card = template.getJSONObject(i);//如果card有load字段,并且字段值是makeup:开头,表示card的数据源为聚合数据if (card.has("load") && card.getString("load").startsWith("makeup:")) {String load = card.getString("load");JSONArray cells = data.getJSONArray(load.substring(load.indexOf(":") + 1));//把模板配置的itemType即具体视图cell写进数据源for (int cellIdx = 0; cellIdx < cells.length(); cellIdx++) {cells.getJSONObject(cellIdx).put("type", card.getString("itemType"));}card.put("items", cells);}}}

解析瀑布流数据,

 //TangramActivity.javavoid parseListData(List<ArticleBean.DataBean.Article> list, @NonNull Card card) {JSONArray cells = new JSONArray();try {for (int i = 0; i < list.size(); i++) {JSONObject obj = new JSONObject(MyApp.gson.toJson(list.get(i)));obj.put("type", card.optStringParam("itemType"));//由于使用了玩安卓的数据结构,这里手动添加一些参数用于演示obj.put("imgUrl", DataUtil.getImgByIdx(i + mListDataPage * list.size()));cells.put(obj);}} catch (JSONException e) {e.printStackTrace();}List<BaseCell> cs = mEngine.parseComponent(cells);card.addCells(cs);card.notifyDataChange();finishLoad();}

完整代码可见TangramActivity.java。

待解决问题

  • 局部刷新问题,暂时无解。之前有小伙伴提到过tangram不支持局部刷新,然后实践了一下,处理起来确实挺棘手,如加载瀑布流数据后,card.notifyDataChange的本质还是notifyDataSetChanged
  • 优化成非继承TangramActivity实现。让业务Activity继承实现始终不够灵活,尝试包装一下核心引擎TangramEngine

android listview数据动态加载_Android | Tangram动态页面之路(六)数据分离相关推荐

  1. Android动态加载黑科技 动态创建Activity模式

    基本信息 Author:kaedea GitHub:android-dynamical-loading 代理Activity模式的限制 还记得我们在代理Activity模式里谈到启动插件APK里的Ac ...

  2. html动态加载js方法,动态引入js四种方法总结

    这次给大家带来动态引入js四种方法总结,动态引入js四种方法的注意事项有哪些,下面就是实战案例,一起来看一下. index.html test.jsalert("hello! I am te ...

  3. layui的tree如何实现动态加载_layui tree动态加载 利用CAReplicatorLayer实现的加载动画 - 电脑常识 - 服务器之家...

    layui tree动态加载 利用CAReplicatorLayer实现的加载动画 发布时间:2017-04-12 来源:服务器之家 在上一篇中,笔者简要介绍了CAReplicatorLayer,在本 ...

  4. HTML5动态加载资源方式,动态加载JavaScript文件的3种方式

    以下是遇到的几种动态加载JavaScript文件的方式,持续更新中... 一.使用document.write/writeln()方式 该种方式可以实现js文件的动态加载,原理就是在重写文档流,这种方 ...

  5. HTML5动态加载资源方式,动态加载JavaScript文件的两种方法

    这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval ...

  6. 第二十四节:动态加载JS和动态加载CSS

    1.动态加载JS 一般需要用到js,需要将js放到<script></<script>中,一般script放到页面底部:或者在顶部引入外部js. <!DOCTYPE ...

  7. Android ListView避免多线程加载一个同一资源

    当我们的ListView中的Item包含图片,而且这些图片是同一资源,我们用多线程去加载图片,这时候可能就发生了这种情况. 比如线程是人,第一个人去做加载图片到缓存的工作,还没做好时第二个人要这同一张 ...

  8. 滚动加载数据 php,无刷新动态加载数据 滚动条加载适合评论等页面

    滚屏加载更多数据,适合评论等页面 本例的数据库很简单,一看就明了 复制代码 代码如下: $query=mysql_query("select * from content order by ...

  9. android动态加载宽高,动态添加LinearLayout的高度实例

    实例如下: WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int ...

最新文章

  1. ipv6改为ipv4
  2. Oracle Eneterprise Linux 5.8上安装Database 12c
  3. 一起谈.NET技术,C#创建不规则窗体的几种方式
  4. dedecmsmip_织梦MIP文章内容页图片适配百度MIP规范
  5. 杭电4530小Q系列故事——大笨钟
  6. 别人加薪你加班,征服老板才是王道
  7. 论文投稿指南——计算机领域核心期刊
  8. matlab 8750h,实测结果表明:九代i7-9750H笔记本标压处理器较8750H提升不大
  9. 买卖股票系列(力扣121、122、123、188、309、714) Java动态规划
  10. mysql5.7小版本升级-windows
  11. 塑胶卡扣弹性计算公式_塑胶卡扣的制作方法
  12. token - 令牌
  13. C语言中的有符号与无符号(挖坑)
  14. 用 PyQt5 制作动态钟表
  15. 【NCNN解读】——benchmark部分
  16. 闭关修炼——one——struts2
  17. 如何获得最新的太阳神三国杀 自己Qt编译
  18. HTTP Component (Apache HttpClient) 5.0 + 教程
  19. 巡风xunfeng代码研究---核心模块深入分析--搜索和搜索结果
  20. HTTP协议 | 一文详解HTTP报文结构

热门文章

  1. 第八篇、盒子模型和距中的设置方法
  2. Java 设计模式 之 中介者模式(Mediator)
  3. goland http proxy 代理设置
  4. python 创建空文件的方法
  5. golang 程序后台运行的方法 linux windows
  6. javascript es6 特性简介
  7. linux shell sed中使用变量
  8. docker 绑定固定ip 跨主机容器互访
  9. linux 功能测试宏 POSIX_C_SOURCE
  10. python yield 详解