1. 程式人生 > >Android listview設定多個不同的item樣式

Android listview設定多個不同的item樣式

實現程式碼

Adapter的程式碼

其中:ViewHolder分別是三個不同的佈局,也就是ListView中每一項的佈局

TYPE_1...是三種類型.

在使用不同佈局的時候,getItemViewType和getViewType不能少,一般是不用這兩個函式的過載的

  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.     finalint VIEW_TYPE = 3;  
  8.     finalint TYPE_1 = 0;  
  9.     finalint TYPE_2 = 1;  
  10.     finalint TYPE_3 = 2;  
  11.     public RunRankAdapter(Context context,  
  12.             ArrayList<HashMap<String, Object>> list) {  
  13.         ls = list;  
  14.         mContext = context;  
  15.     }  
  16.     @Override
  17.     publicint getCount() {  
  18.         return ls.size();  
  19.     }  
  20.     @Override
  21.     public Object getItem(int position) {  
  22.         return ls.get(position);  
  23.     }  
  24.     @Override
  25.     publiclong getItemId(int position) {  
  26.         return0;  
  27.     }  
  28.     // 每個convert view都會呼叫此方法,獲得當前所需要的view樣式
  29.     @Override
  30.     publicint getItemViewType(int position) {  
  31.         int p = position;  
  32.         if (p == 0)  
  33.             return TYPE_1;  
  34.         elseif (p == 1)  
  35.             return TYPE_2;  
  36.         else
  37.             return TYPE_3;  
  38.     }  
  39.     @Override
  40.     publicint getViewTypeCount() {  
  41.         return3;  
  42.     }  
  43.     @Override
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         ViewHolder1 holder1 = null;  
  46.         ViewHolder2 holder2 = null;  
  47.         ViewHolder3 holder3 = null;  
  48.         int type = getItemViewType(position);  
  49.         if (convertView == null) {  
  50.             inflater = LayoutInflater.from(mContext);  
  51.             // 按當前所需的樣式,確定new的佈局
  52.             switch (type) {  
  53.             case TYPE_1:  
  54.                 convertView = inflater.inflate(R.layout.item_runrank1,  
  55.                         parent, false);  
  56.                 holder1 = new ViewHolder1();  
  57.                 holder1.rank1 = (TextView) convertView  
  58.                         .findViewById(R.id.tv_list1_rank);  
  59.                 holder1.time1 = (TextView) convertView  
  60.                         .findViewById(R.id.tv_list1_time);  
  61.                 convertView.setTag(holder1);  
  62.                 break;  
  63.             case TYPE_2:  
  64.                 convertView = inflater.inflate(R.layout.item_runrank2,  
  65.                         parent, false);  
  66.                 holder2 = new ViewHolder2();  
  67.                 holder2.rank2 = (TextView) convertView  
  68.                         .findViewById(R.id.tv_list2_rank);  
  69.                 holder2.time2 = (TextView) convertView  
  70.                         .findViewById(R.id.tv_list2_time);  
  71.                 convertView.setTag(holder2);  
  72.                 break;  
  73.             case TYPE_3:  
  74.                 convertView = inflater.inflate(R.layout.item_runrank3,  
  75.                         parent, false);  
  76.                 holder3 = new ViewHolder3();  
  77.                 holder3.rank3 = (TextView) convertView  
  78.                         .findViewById(R.id.tv_list3_rank);  
  79.                 holder3.time3 = (TextView) convertView  
  80.                         .findViewById(R.id.tv_list3_time);  
  81.                 convertView.setTag(holder3);  
  82.                 break;  
  83.             default:  
  84.                 break;  
  85.             }  
  86.         } else {  
  87.             switch (type) {  
  88.             case TYPE_1:  
  89.                 holder1 = (ViewHolder1) convertView.getTag();  
  90.                 break;  
  91.             case TYPE_2:  
  92.                 holder2 = (ViewHolder2) convertView.getTag();  
  93.                 break;  
  94.             case TYPE_3:  
  95.                 holder3 = (ViewHolder3) convertView.getTag();  
  96.                 break;  
  97.             }  
  98.         }  
  99.         // 設定資源
  100.         switch (type) {  
  101.         case TYPE_1:  
  102.             holder1.rank1.setText("" + (position + 1));  
  103.             holder1.time1.setText(ls.get(position).get("time").toString());  
  104.             break;  
  105.         case TYPE_2:  
  106.             holder2.rank2.setText("" + (position + 1));  
  107.             holder2.time2.setText(ls.get(position).get("time").toString());  
  108.             holder2.totaldistance2.setText(ls.get(position)  
  109.             break;  
  110.         case TYPE_3:  
  111.             holder3.rank3.setText("" + (position + 1));  
  112.             holder3.time3.setText(ls.get(position).get("time").toString());  
  113.             break;  
  114.         }  
  115.         return convertView;  
  116.     }  
  117.     publicclass ViewHolder1 {  
  118.         TextView rank1;  
  119.         TextView time1;  
  120.     }  
  121.     publicclass ViewHolder2 {  
  122.         TextView rank2;  
  123.         TextView time2;  
  124.     }  
  125.     publicclass ViewHolder3 {  
  126.         TextView rank3;  
  127.         TextView time3;  
  128.     }  
  129. }  

使用方式:

宣告並定義自己的Adapter,在ListView中設定他的Adapter

  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()方法一定要過載,返回值應該是不同佈局的種類數