listview的多布局实现

实现代码

Adapter的代码

其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局

TYPE_1...是三种类型.

在使用不同布局的时候,getItemViewType和getViewTypeCount不能少,一般的同一种item的列表是不用这两个函数的重载的,但是如果需要不同种类的item,就必须重载这两个

[java]  view plain  copy
  1. class RunRankAdapter extends BaseAdapter {  
  2.     ArrayList<HashMap<String, Object>> ls;  
  3.     Context mContext;  
  4.     LinearLayout linearLayout = null;  
  5.     LayoutInflater inflater;  
  6.     TextView tex;  
  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 RunRankAdapter(Context context,  
  13.             ArrayList<HashMap<String, Object>> list) {  
  14.         ls = list;  
  15.         mContext = context;  
  16.     }  
  17.   
  18.     @Override  
  19.     public int getCount() {  
  20.         return ls.size();  
  21.     }  
  22.   
  23.     @Override  
  24.     public Object getItem(int position) {  
  25.         return ls.get(position);  
  26.     }  
  27.   
  28.     @Override  
  29.     public long getItemId(int position) {  
  30.         return 0;  
  31.     }  
  32.   
  33.     // 每个convert view都会调用此方法,获得当前所需要的view样式  
  34.     @Override  
  35.     public int getItemViewType(int position) {  
  36.         int p = position;  
  37.         if (p == 0)  
  38.             return TYPE_1;  
  39.         else if (p == 1)  
  40.             return TYPE_2;  
  41.         else  
  42.             return TYPE_3;  
  43.     }  
  44.   
  45.     @Override  
  46.     public int getViewTypeCount() {  
  47.         return 3;  
  48.     }  
  49.   
  50.     @Override  
  51.     public View getView(int position, View convertView, ViewGroup parent) {  
  52.         ViewHolder1 holder1 = null;  
  53.         ViewHolder2 holder2 = null;  
  54.         ViewHolder3 holder3 = null;  
  55.         int type = getItemViewType(position);  
  56.         if (convertView == null) {  
  57.             inflater = LayoutInflater.from(mContext);  
  58.             // 按当前所需的样式,确定new的布局  
  59.             switch (type) {  
  60.             case TYPE_1:  
  61.   
  62.                 convertView = inflater.inflate(R.layout.item_runrank1,  
  63.                         parent, false);  
  64.                 holder1 = new ViewHolder1();  
  65.                 holder1.rank1 = (TextView) convertView  
  66.                         .findViewById(R.id.tv_list1_rank);  
  67.                 holder1.time1 = (TextView) convertView  
  68.                         .findViewById(R.id.tv_list1_time);  
  69.                 convertView.setTag(holder1);  
  70.                 break;  
  71.             case TYPE_2:  
  72.                 convertView = inflater.inflate(R.layout.item_runrank2,  
  73.                         parent, false);  
  74.                 holder2 = new ViewHolder2();  
  75.                 holder2.rank2 = (TextView) convertView  
  76.                         .findViewById(R.id.tv_list2_rank);  
  77.                 holder2.time2 = (TextView) convertView  
  78.                         .findViewById(R.id.tv_list2_time);  
  79.                 convertView.setTag(holder2);  
  80.                 break;  
  81.             case TYPE_3:  
  82.                 convertView = inflater.inflate(R.layout.item_runrank3,  
  83.                         parent, false);  
  84.                 holder3 = new ViewHolder3();  
  85.                 holder3.rank3 = (TextView) convertView  
  86.                         .findViewById(R.id.tv_list3_rank);  
  87.                 holder3.time3 = (TextView) convertView  
  88.                         .findViewById(R.id.tv_list3_time);  
  89.                 convertView.setTag(holder3);  
  90.                 break;  
  91.             default:  
  92.                 break;  
  93.             }  
  94.   
  95.         } else {  
  96.             switch (type) {  
  97.             case TYPE_1:  
  98.                 holder1 = (ViewHolder1) convertView.getTag();  
  99.                 break;  
  100.             case TYPE_2:  
  101.                 holder2 = (ViewHolder2) convertView.getTag();  
  102.                 break;  
  103.             case TYPE_3:  
  104.                 holder3 = (ViewHolder3) convertView.getTag();  
  105.                 break;  
  106.             }  
  107.         }  
  108.         // 设置资源  
  109.         switch (type) {  
  110.         case TYPE_1:  
  111.             holder1.rank1.setText("" + (position + 1));  
  112.             holder1.time1.setText(ls.get(position).get("time").toString());  
  113.             break;  
  114.         case TYPE_2:  
  115.             holder2.rank2.setText("" + (position + 1));  
  116.             holder2.time2.setText(ls.get(position).get("time").toString());  
  117.             holder2.totaldistance2.setText(ls.get(position)  
  118.             break;  
  119.         case TYPE_3:  
  120.             holder3.rank3.setText("" + (position + 1));  
  121.             holder3.time3.setText(ls.get(position).get("time").toString());  
  122.             break;  
  123.         }  
  124.   
  125.         return convertView;  
  126.     }  
  127.   
  128.     public class ViewHolder1 {  
  129.         TextView rank1;  
  130.         TextView time1;  
  131.     }  
  132.   
  133.     public class ViewHolder2 {  
  134.         TextView rank2;  
  135.         TextView time2;  
  136.     }  
  137.   
  138.     public class ViewHolder3 {  
  139.         TextView rank3;  
  140.         TextView time3;  
  141.     }  
  142. }  

使用方式:

声明并定义自己的Adapter,在ListView中设置他的Adapter

[java]  view plain  copy
  1. private RunRankAdapter runRankAdapter;    
  2. ArrayList<HashMap<String, Object>> runRank;    
  3. ListView lv_runRank;  
  4. runRank = new ArrayList<HashMap<String, Object>>();    
  5. runRankAdapter = new RunRankAdapter(this, runRank);    
  6. lv_runRank = (ListView) findViewById(R.id.lv_runRank);    
  7. lv_runRank.setAdapter(runRankAdapter);  


还有一种方法:

在主布局文件中包含一个LinearLayout. 并且设置android:orientation="vertical"
定义两种不同的布局文件,然后代码中,根据不同条件调用.addview向LinearLayout加载就可以了


需要注意的地方:adapter中的getViewTypeCount()方法一定要重载,返回值应该是不同布局的种类数

猜你喜欢

转载自blog.csdn.net/qq_35700935/article/details/80737011
今日推荐