Android ListView多布局讲解

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述Android ListView多布局讲解相关的知识,希望能为你提供帮助。
Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用、在getView()中减少逻辑计算、减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片。而今天要介绍的是另一种方式,那就是多布局。  Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用、在getView()中减少逻辑计算、减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片。而今天要介绍的是另一种方式,那就是多布局。
一般使用的场景有一下两种情况:
① 当一个item有多重布局的情况下,使用部分隐藏来实现既笨拙又效率低下,这时多布局会是个不错的选择;
② 当一个item很复杂,页面内容多,item高度很高,甚至超过手机屏幕,这个时候就需要使用多布局将页面拆分成多个小item来提高执行效率。
举个栗子:如下销售订单列表,我们发现一个单个item的页面高度很高,内容也很多,中部的商品个数还具有不确定性,这时的实现的方式我们可以看下:

Android ListView多布局讲解

文章图片

  代码如下:
1 @Override 2 public View getView(final int position, View convertView, ViewGroup rootview) { 3ViewHolder viewHolder = null; 4if (convertView == null) { 5viewHolder = new ViewHolder(); 6convertView = inflater.inflate(R.layout.item_list_order, rootview, false); 7// ... 8convertView.setTag(viewHolder); 9} else { 10viewHolder = (ViewHolder) convertView.getTag(); 11} 12 13for (int i = 0; i < arrListOrder.get(position).size(); i++) { 14View v = inflater.inflate(R.layout.item_order_goods, null); 15// ... 16viewHolder.llayoutGoodsList.addView(v); 17} 18 19// ... 20return convertView; 21 }

 
这种写法诟病很大,严重影响性能,此外如果商品数量有个10个8个的会导致item过高,此外在getView()中for循环new布局对象是是否消耗内存的和执行时间的。
 
那么,我们用多布局拆分下:
 
Android ListView多布局讲解

文章图片

 
这种布局方式就叫ListView的多布局。采用将一个大的 item 切割成多个小item以降低布局的复杂度,提高重用率。那么直接看这种方式的实现方式:
 
1 public class OrderListActivity extends Activity { 2// ... 3 4/** 解析请求数据 */ 5private ArrayList< HashMap< String, Object> > analyticalData(String json) { 6ArrayList< HashMap< String, Object> > arrListGoods = new ArrayList< > (); 7try { 8JSONArray jsArr = new JSONArray(json); 9for (int i = 0; i < jsArr.length(); i++) { 10JSONObject jsObj = 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); 16 17// 商品 18JSONArray arrJsonGoods = jsObj.getJSONArray("order_goods"); 19JSONObject jsobjPay = new JSONObject(); 20for (int j = 0; j < arrJsonGoods.length(); i++) { 21HashMap< String, Object> hashMapGoods = new HashMap< > (); 22hashMapHead.put("goods_name", jsObj.optString("goods_name")); //商品名 23// ... 24hashMapHead.put("item_type", OrderListAdapter.NI_ORDER_ITEM_GOODS); 25arrListGoods.add(hashMapGoods); 26} 27 28// 底部 29HashMap< String, Object> hashMapFoot = new HashMap< > (); 30hashMapFoot.put("address", jsObj.optString("address")); // 地址 31// ... 32hashMapHead.put("item_type", OrderListAdapter.NI_ORDER_ITEM_FOOT); 33arrListGoods.add(hashMapFoot); 34} 35} catch (JSONException e) { 36return null; 37} 38return arrListGoods; 39} 40 }

 
1 public class OrderListAdapter extends BaseAdapter { 2 3public static final int NI_ORDER_ITEM_HEAD = 0; // 这要从0按顺序往下变化,否则报错“数组下标溢出”,原因还不清楚 4public static final int NI_ORDER_ITEM_GOODS = 1; 5public static final int NI_ORDER_ITEM_FOOT = 2; 6 7// ... 8/** 获取布局的类型 */ 9@Override 10public int getItemViewType(int position) { 11try { 12int i = Integer.parseInt(mAppList.get(position).get("item_type").toString()); 13switch (i){ 14case NI_ORDER_ITEM_HEAD: 15case NI_ORDER_ITEM_GOODS: 16case NI_ORDER_ITEM_FOOT: 17return i; 18} 19} catch (Exception e) { 20} 21return super.getItemViewType(position); 22} 23/** 获取布局类型的总数 */ 24@Override 25public int getViewTypeCount() { 26return 3; 27} 28 29@Override 30public View getView(int position, View convertView, ViewGroup rootview) { 31ViewHolder viewHolderHead = null; 32ViewHolder viewHolderGoods = null; 33ViewHolder viewHolderFoot = null; 34int type = getItemViewType(position); 35if (convertView == null) { 36switch(type){ 37case NI_ORDER_ITEM_HEAD: 38viewHolderHead = new viewHolderHead(); 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; 43case NI_ORDER_ITEM_GOODS: 44viewHolderGoods = new viewHolderGoods(); 45convertView = mInflater.inflate(R.layout.item_list_order_goods, rootview, false); 46// ...初始化布局 47convertView.setTag(R.layout.item_list_order_goods, viewHolderGoods); 48break; 49case NI_ORDER_ITEM_FOOT: 50viewHolderFoot = new viewHolderFoot(); 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){ 58case NI_ORDER_ITEM_HEAD: 59viewHolderHead = getTag(R.layout.item_list_order_head); 60break; 61case NI_ORDER_ITEM_GOODS: 62viewHolderGoods = getTag(R.layout.item_list_order_goods); 63break; 64case NI_ORDER_ITEM_FOOT: 65viewHolderFoot = getTag(R.layout.item_list_order_foot); 66break; 67} 68} 69switch(type){ 70case NI_ORDER_ITEM_HEAD: 71// ...处理逻辑 72break; 73case NI_ORDER_ITEM_GOODS: 74// ... 75break; 76case NI_ORDER_ITEM_FOOT: 77// ... 78break; 79} 80return convertView; 81} 82 83private class ViewHolderHead { 84// ... 85} 86private class ViewHolderGoods { 87// ... 88} 89private class ViewHolderFoot { 90// ... 91} 92 93// ... 94 }

 
好,到这里就介绍完了,活用多布局,对提高Listview的执行效率是很有帮助的。
【Android ListView多布局讲解】 

    推荐阅读