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}
1publicclassOrderListAdapterextendsBaseAdapter{23publicstaticfinalintNI_ORDER_ITEM_HEAD=0;//这要从0按顺序往下变化,否则报错“数组下标溢出”,原因还不清楚4publicstaticfinalintNI_ORDER_ITEM_GOODS=1;5publicstaticfinalintNI_ORDER_ITEM_FOOT=2;67//...8/**获取布局的类型*/9@Override10publicintgetItemViewType(intposition){11try{12inti=Integer.parseInt(mAppList.get(position).get("item_type").toString());13switch(i){14caseNI_ORDER_ITEM_HEAD:15caseNI_ORDER_ITEM_GOODS:16caseNI_ORDER_ITEM_FOOT:17returni;18}19}catch(Exceptione){20}21returnsuper.getItemViewType(position);22}23/**获取布局类型的总数*/24@Override25publicintgetViewTypeCount(){26return3;27}2829@Override30publicViewgetView(intposition,ViewconvertView,ViewGrouprootview){31ViewHolderviewHolderHead=null;32ViewHolderviewHolderGoods=null;33ViewHolderviewHolderFoot=null;34inttype=getItemViewType(position);35if(convertView==null){36switch(type){37caseNI_ORDER_ITEM_HEAD:38viewHolderHead=newviewHolderHead();39convertView=mInflater.inflate(R.layout.item_list_order_head,rootview,false);40//...初始化布局41convertView.setTag(R.layout.item_list_order_head,viewHolderHead);//这里要用setTag(int,Object);42break;43caseNI_ORDER_ITEM_GOODS:44viewHolderGoods=newviewHolderGoods();45convertView=mInflater.inflate(R.layout.item_list_order_goods,rootview,false);46//...初始化布局47convertView.setTag(R.layout.item_list_order_goods,viewHolderGoods);48break;49caseNI_ORDER_ITEM_FOOT: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}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。