实现ListView 三种不同布局的加载的方式

时间:2022-11-12 08:09:46

       相信大家都会使用ListView加载相同的布局了,接下来这篇文章,想说一下,如果要加载多种不同的布局该怎么去实现?

       其实很简单,与之不同的是 ,加载相同的布局,我们只需搭建一种布局模板即可,而如果要加载多种不同的布局,我们就得准备好这几种不同的布局模板 ,接下来 我们就用个实例来说一下,如何加载三种不同的布局?

       之前我们加载同一种布局的时候,是没必须写这两个方法的,但在加载多种不同布局的时候,我们就必须在自定义的Adapter中重写这两个方法, getItemViewType(int position) 和getViewTypeCount()

实例如下:

分析 如下:

     第一步: 自定义CustomAdapter,继承自BaseAdapter,并重写其抽象方法,尤其必须重写文中提到的那两个方法

[java] view plain copy 实现ListView 三种不同布局的加载的方式实现ListView 三种不同布局的加载的方式
  1. class CustomAdapter extends BaseAdapter {  
  2.     ArrayList<HashMap<String, Object>> lists;  
  3.     Context context;  
  4.     LinearLayout linearLayout = null;  
  5.     LayoutInflater inflater;  
  6.     TextView text;  
  7.     final int VIEW_TYPE = 3;  
  8.     final int TYPE_1 = 0;  
  9.     final int TYPE_2 = 1;  
  10.     final int TYPE_3 = 2;  
  11.   
  12.     public CustomAdapter(Context context,  
  13.             ArrayList<HashMap<String, Object>> lists) {  
  14.         this.lists = lists;  
  15.         this.context = context;  
  16.     }  
  17.   
  18.     @Override  
  19.     public int getCount() {  
  20.         return lists.size();  
  21.     }  
  22.   
  23.     @Override  
  24.     public Object getItem(int position) {  
  25.         return lists.get(position);  
  26.     }  
  27.   
  28.     @Override  
  29.     public long getItemId(int position) {  
  30.         return 0;  
  31.     }  

  32.   
  33. //    这个方法必须重写 ,这个item要加载什么 布局类型
  34. //    每个convertView都会调用此方法,获得当前所需要的view模板 
  35.     @Override  
  36.     public int getItemViewType(int position) {  
  37.         int p = position;  
  38.         if (p == 0)  
  39.             return TYPE_1;  
  40.         else if (p == 1)  
  41.             return TYPE_2;  
  42.         else  
  43.             return TYPE_3;  
  44.     }  
  45.   
  46. //  这个方法必须重写
  47. //  获得几种布局模板
  48.     @Override  
  49.     public int getViewTypeCount() {  
  50.         return 3;  
  51.     }  
  52.   
  53.     @Override  
  54.     public View getView(int position, View convertView, ViewGroup parent) {  
  55.         ViewHolder1 holder1 = null;  
  56.         ViewHolder2 holder2 = null;  
  57.         ViewHolder3 holder3 = null;  
  58.         int type = getItemViewType(position);  
  59.         if (convertView == null) {  
  60.             inflater = LayoutInflater.from(context);  

  61.             // 这里使用switch 最好了,根据布局类型,来加载什么布局模板
  62.             switch (type) {  
  63.             case TYPE_1:  
  64.   
  65.                 convertView = inflater.inflate(R.layout.item_type1,  
  66.                         parent, false);  
  67.                 holder1 = new ViewHolder1();  
  68.                 holder1.name = (TextView) convertView  
  69.                         .findViewById(R.id.tv_list1_name);  
  70.                 holder1.age = (TextView) convertView  
  71.                         .findViewById(R.id.tv_list1_age);  
  72.                 convertView.setTag(holder1);  
  73.                 break;  
  74.             case TYPE_2:  
  75.                 convertView = inflater.inflate(R.layout.item_type2,  
  76.                         parent, false);  
  77.                 holder2 = new ViewHolder2();  
  78.                 holder2.name = (TextView) convertView  
  79.                         .findViewById(R.id.tv_list2_name);  
  80.                 holder2.age = (TextView) convertView  
  81.                         .findViewById(R.id.tv_list2_age);  
  82.                 convertView.setTag(holder2);  
  83.                 break;  
  84.             case TYPE_3:  
  85.                 convertView = inflater.inflate(R.layout.item_type3,  
  86.                         parent, false);  
  87.                 holder3 = new ViewHolder3();  
  88.                 holder3.name = (TextView) convertView  
  89.                         .findViewById(R.id.tv_list3_name);  
  90.                 holder3.age = (TextView) convertView  
  91.                         .findViewById(R.id.tv_list3_age);  
  92.                 convertView.setTag(holder3);  
  93.                 break;  
  94.             }  

  1.   
  2.         } else {  
  3.             switch (type) {  
  4.             case TYPE_1:  
  5.                 holder1 = (ViewHolder1) convertView.getTag();  
  6.                 break;  
  7.             case TYPE_2:  
  8.                 holder2 = (ViewHolder2) convertView.getTag();  
  9.                 break;  
  10.             case TYPE_3:  
  11.                 holder3 = (ViewHolder3) convertView.getTag();  
  12.                 break;  
  13.             }  
  14.         }  
// 这里用个switch来做判断最好了,根据加载时哪种布局,给这个布局上的控件赋值
  1.         switch (type) {  
  2.         case TYPE_1:  
  3.             holder1.name.setText("" + (position + 1));  
  4.             holder1.age.setText(lists.get(position).get("age").toString());  
  5.             break;  
  6.         case TYPE_2:  
  7.             holder2.name.setText("" + (position + 1));  
  8.             holder2.age.setText(ls.get(position).get("age").toString());  
  9.             holder2.totaldistance2.setText(lists.get(position);  
  10.             break;  
  11.         case TYPE_3:  
  12.             holder3.name.setText("" + (position + 1));  
  13.             holder3.age.setText(lists.get(position).get("age").toString());  
  14.             break;  
  15.         }  
  16.   
  17.         return convertView;  
  18.     }  
  19.   
  20.     public class ViewHolder1 {  
  21.         TextView name;  
  22.         TextView age;  
  23.     }  
  24.   
  25.     public class ViewHolder2 {  
  26.         TextView name;  
  27.         TextView age;  
  28.     }  
  29.   
  30.     public class ViewHolder3 {  
  31.         TextView name;  
  32.         TextView age;  
  33.     }  
  34. }  

         

第二步:接下来 就是在ListView上显示这三种不同的布局了 

 

[java] view plain copy 实现ListView 三种不同布局的加载的方式实现ListView 三种不同布局的加载的方式
  1. privateCustomAdaptercustomAdapter;    
  2. ArrayList<HashMap<String, Object>> lists;
  3. ListView listView;
  4. lists=new ArrayList<HashMap<String, Object>>();    
  5. customAdapter=new CustomAdapter(this, lists);
  6. listView= (Listview) view.findViewById(R.id.lv_listView);
  7. listView.setAdapter(customAdapter);