Android ListView多布局讲解
Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用、在getView()中减少逻辑计算、减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片。而今天要介绍的是另一种方式,那就是多布局。 一般使用的场景有一下两种情况: ① 当一个item有多重布局的情况下,使用部分隐藏来实现既笨拙又效率低下,这时多布局会是个不错的选择; ② 当一个item很复杂,页面内容多,item高度很高,甚至超过手机屏幕,这个时候就需要使用多布局将页面拆分成多个小item来提高执行效率。 举个栗子:如下销售订单列表,我们发现一个单个item的页面高度很高,内容也很多,中部的商品个数还具有不确定性,这时的实现的方式我们可以看下: 代码如下: 1@Override2publicViewgetView(finalintposition,ViewconvertView,ViewGrouprootview){3ViewHolderviewHolder=null;4if(convertView==null){5viewHolder=newViewHolder();6convertView=inflater.inflate(R.layout.item_list_order,rootview,false);7//...8convertView.setTag(viewHolder);9}else{10viewHolder=(ViewHolder)convertView.getTag();11}1213for(inti=0;i<arrListOrder.get(position).size();i++){14Viewv=inflater.inflate(R.layout.item_order_goods,null);15//...16viewHolder.llayoutGoodsList.addView(v);17}1819//...20returnconvertView;21} 这种写法诟病很大,严重影响性能,此外如果商品数量有个10个8个的会导致item过高,此外在getView()中for循环new布局对象是是否消耗内存的和执行时间的。 那么,我们用多布局拆分下: 这种布局方式就叫ListView的多布局。采用将一个大的 item 切割成多个小item以降低布局的复杂度,提高重用率。那么直接看这种方式的实现方式: 1publicclassOrderListActivityextendsActivity{2//...34/**解析请求数据*/5privateArrayList<HashMap<String,Object>>analyticalData(Stringjson){6ArrayList<HashMap<String,Object>>arrListGoods=newArrayList<>();7try{8JSONArrayjsArr=newJSONArray(json);9for(inti=0;i<jsArr.length();i++){10JSONObjectjsObj=jsArr.optJSONObject(i);11//头部12hashMapHead.put("order_sn",jsObj.optString("order_sn"));//销售订单号13//...14hashMapHead.put("item_type",OrderListAdapter.NI_ORDER_ITEM_HEAD);//设置布局类型15arrListGoods.add(hashMapHead);1617//商品18JSONArrayarrJsonGoods=jsObj.getJSONArray("order_goods");19JSONObjectjsobjPay=newJSONObject();20for(intj=0;j<arrJsonGoods.length();i++){21HashMap<String,Object>hashMapGoods=newHashMap<>();22hashMapHead.put("goods_name",jsObj.optString("goods_name"));//商品名23//...24hashMapHead.put("item_type",OrderListAdapter.NI_ORDER_ITEM_GOODS);25arrListGoods.add(hashMapGoods);26}2728//底部29HashMap<String,Object>hashMapFoot=newHashMap<>();30hashMapFoot.put("address",jsObj.optString("address"));//地址31//...32hashMapHead.put("item_type",OrderListAdapter.NI_ORDER_ITEM_FOOT);33arrListGoods.add(hashMapFoot);34}35}catch(JSONExceptione){36returnnull;37}38returnarrListGoods;39}40} 50viewHolderFoot=newviewHolderFoot();51convertView=mInflater.inflate(R.layout.item_list_order_foot,rootview,false);52//...初始化布局53convertView.setTag(R.layout.item_list_order_foot,viewHolderFoot);54break;55}56}else{57switch(type){58caseNI_ORDER_ITEM_HEAD:59viewHolderHead=getTag(R.layout.item_list_order_head);60break;61caseNI_ORDER_ITEM_GOODS:62viewHolderGoods=getTag(R.layout.item_list_order_goods);63break;64caseNI_ORDER_ITEM_FOOT:65viewHolderFoot=getTag(R.layout.item_list_order_foot);66break;67}68}69switch(type){70caseNI_ORDER_ITEM_HEAD:71//...处理逻辑72break;73caseNI_ORDER_ITEM_GOODS:74//...75break;76caseNI_ORDER_ITEM_FOOT:77//...78break;79}80returnconvertView;81}8283privateclassViewHolderHead{84//...85}86privateclassViewHolderGoods{87//...88}89privateclassViewHolderFoot{90//...91}9293//...94} 本文转自lzwxx 51CTO博客,原文链接: http://blog.51cto.com/13064681/1948199