ListView的不同item加载不同Layout

来源:互联网 发布:黄金时代超人 知乎 编辑:程序博客网 时间:2024/06/05 06:31

转自:http://blog.csdn.net/junhuahouse/article/details/38261919?utm_source=tuicool&utm_medium=referral

重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,优化ListView以提高性能。convertViewItem为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形,首先看图效果展示:

点击下载该内容源码

       












在编写代码之前呢,我们需要做这些工作并了解其作用:

  1)重写 getViewTypeCount() – 该方法返回多少个不同的布局

  2)重写 getItemViewType(int) – 根据position返回相应的Item

  3)根据view item的类型,在getView中创建正确的convertView

下面让我们看一下代码怎么实现:

MainActivity.class

[java] view plain copy
 print?
  1. /** 
  2.  *  
  3.  *ListViewDifferentType 
  4.  * @author Yuanjunhua 
  5.  * 
  6.  * 2014-7-28下午6:23:39 
  7.  */  
  8. public class MainActivity extends Activity {  
  9.   
  10.     private ListView listView;  
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.           
  16.         listView=(ListView) findViewById(R.id.lsitview);  
  17.         String[] name1=new String[]{"北京","上海","南京","郑州","轻工业学院","姜寨村"};  
  18.         String[] name2=new String[]{"北京","上海","南京","郑州","轻工业学院","姜寨村"};  
  19.         Integer[] id2=new Integer[]{  
  20.                 R.drawable.jx_left_listitem_1,  
  21.                 R.drawable.jx_left_listitem_2,  
  22.                 R.drawable.jx_left_listitem_3,  
  23.                 R.drawable.jx_left_listitem_4,  
  24.                 R.drawable.jx_left_listitem_5,  
  25.                 R.drawable.jx_left_listitem_6};  
  26.           
  27.         List<String> list1=new ArrayList<String>();  
  28.         fillListMethod(list1,name1);  
  29.           
  30.         List<Map<String,Integer>> list2=new ArrayList<Map<String,Integer>>();  
  31.         fillMapMethod(list2,name2,id2);  
  32.           
  33.         Log.d("mapList""mapList=="+list1);  
  34.         Log.d("strList""strList=="+list2);  
  35.         listView.setAdapter(new MyAdapter(this, list1, list2));  
  36.           
  37.     }  
  38.   
  39.     private void fillMapMethod(List<Map<String, Integer>> list,String[] name,Integer[] id) {  
  40.         // TODO Auto-generated method stub  
  41.         for (int i = 0; i < name.length; i++) {  
  42.             Map<String,Integer> map=new HashMap<String, Integer>();  
  43.             map.put(name[i], id[i]);  
  44.             list.add(map);  
  45.         }  
  46.     }  
  47.   
  48.     private void fillListMethod(List<String> list,String[] name) {  
  49.         // TODO Auto-generated method stub  
  50.         for (int i = 0; i < name.length; i++) {  
  51.             list.add(name[i]);  
  52.         }  
  53.     }  
  54.   
  55.     @Override  
  56.     public boolean onCreateOptionsMenu(Menu menu) {  
  57.         // Inflate the menu; this adds items to the action bar if it is present.  
  58.         getMenuInflater().inflate(R.menu.main, menu);  
  59.         return true;  
  60.     }  
  61.   
  62. }  

继承BaseAdapter

[java] view plain copy
 print?
  1. /** 
  2.  *  
  3.  *ListViewDifferentType 
  4.  * @author Yuanjunhua 
  5.  * 
  6.  * 2014-7-28下午6:23:31 
  7.  */  
  8. public class MyAdapter extends BaseAdapter {  
  9.   
  10.     private LayoutInflater li;  
  11.     private List<String> list;  
  12.     private List<Map<String,Integer>> map;  
  13.     private final int TYPE_ONE=0,TYPE_TWO=1,TYPE_COUNT=2;  
  14.     public MyAdapter(Context context,List<String> list,List<Map<String,Integer>> map) {  
  15.         // TODO Auto-generated constructor stub  
  16.         this.list =list;  
  17.         this.map =map;  
  18.         li=LayoutInflater.from(context);  
  19.     }  
  20.       
  21.     @Override  
  22.     public int getCount() {  
  23.         // TODO Auto-generated method stub  
  24.         return list.size()+map.size();  
  25.     }  
  26.       
  27.     /** 该方法返回多少个不同的布局*/  
  28.     @Override  
  29.     public int getViewTypeCount() {  
  30.         // TODO Auto-generated method stub  
  31.         return TYPE_COUNT;  
  32.     }  
  33.     /** 根据position返回相应的Item*/  
  34.     @Override  
  35.     public int getItemViewType(int position) {  
  36.         // TODO Auto-generated method stub  
  37.         int po = position % 2;  
  38.         if (po == TYPE_ONE)  
  39.             return TYPE_ONE;  
  40.         else  
  41.             return TYPE_TWO;  
  42.     }  
  43.   
  44.     @Override  
  45.     public Object getItem(int position) {  
  46.         // TODO Auto-generated method stub  
  47.         return list.get(position%6);  
  48.     }  
  49.   
  50.     @Override  
  51.     public long getItemId(int position) {  
  52.         // TODO Auto-generated method stub  
  53.         return position%6;  
  54.     }  
  55.   
  56.     @Override  
  57.     public View getView(int position, View convertView, ViewGroup parent) {  
  58.         // TODO Auto-generated method stub  
  59.         ViewHolder1 vh1=null;  
  60.         ViewHolder2 vh2=null;  
  61.         int type=getItemViewType(position);  
  62.         if(convertView==null){  
  63.             switch (type) {  
  64.             case TYPE_ONE:  
  65.                 vh1=new ViewHolder1();  
  66.                 convertView=li.inflate(R.layout.item_one, null);  
  67.                 vh1.tv1=(TextView) convertView.findViewById(R.id.tv1);  
  68.                   
  69.                 convertView.setTag(vh1);  
  70.                   
  71.                 break;  
  72.             case TYPE_TWO:  
  73.                 vh2=new ViewHolder2();  
  74.                 convertView=li.inflate(R.layout.item_two, null);  
  75.                 vh2.tv2=(TextView) convertView.findViewById(R.id.tv2);  
  76.                 vh2.img2=(ImageView) convertView.findViewById(R.id.img2);  
  77.                 convertView.setTag(vh2);  
  78.                 break;  
  79.             }  
  80.         }  
  81.         else{  
  82.             switch (type) {  
  83.             case TYPE_ONE:  
  84.                 vh1=(ViewHolder1) convertView.getTag();  
  85.                 break;  
  86.             case TYPE_TWO:  
  87.                 vh2=(ViewHolder2) convertView.getTag();  
  88.                 break;  
  89.             }  
  90.         }  
  91.           
  92.         switch (type) {  
  93.         case TYPE_ONE:  
  94.             if(position<5)  
  95.             vh1.tv1.setText(list.get((position%6)-(position%6)/2));  
  96.             if(position>5)  
  97.                 vh1.tv1.setText(list.get((position%6)-(position%6)/2+3));  
  98.             break;  
  99.         case TYPE_TWO:  
  100.             int i=0;  
  101.             String txt=null;  
  102.             Map<String,Integer> mapSI=null;  
  103.             if(position<6){  
  104.                 i=(position%6)-(position%6+1)/2;  
  105.                 mapSI=map.get(i);  
  106.                 Iterator<String> it=mapSI.keySet().iterator();  
  107.                 if(it.hasNext()) txt=it.next();  
  108.             }  
  109.                   
  110.             if(position>6){  
  111.                 i=(position%6)-(position%6+1)/2+3;  
  112.                 mapSI=map.get(i);  
  113.                 Iterator<String> it=mapSI.keySet().iterator();  
  114.                 if(it.hasNext()) txt=it.next();  
  115.             }  
  116.             vh2.tv2.setText(txt);  
  117.             vh2.img2.setBackgroundResource(mapSI.get(txt));  
  118.             Log.d("txt""txt=="+txt);  
  119.             break;  
  120.         }  
  121.         return convertView;  
  122.     }  
  123.       
  124.     static class ViewHolder1{  
  125.         TextView tv1;  
  126.     }  
  127.     static class ViewHolder2{  
  128.         TextView tv2;  
  129.         ImageView img2;  
  130.     }  
  131.   
  132. }  
实现上图的效果就用这么几句代码!!
0 0
原创粉丝点击