實現代碼
Adapter的代碼
其中:ViewHolder分別是三個不同的布局,也就是ListView中每一項的布局
TYPE_1...是三種類型.
在使用不同布局的時候,getItemViewType和getViewType不能少,一般是不用這兩個函數的重載的
class RunRankAdapter extends BaseAdapter {ArrayList<HashMap<String, Object>> ls;Context mContext;LinearLayout linearLayout = null;LayoutInflater inflater;TextView tex;final int VIEW_TYPE = 3;final int TYPE_1 = 0;final int TYPE_2 = 1;final int TYPE_3 = 2;public RunRankAdapter(Context context,ArrayList<HashMap<String, Object>> list) {ls = list;mContext = context;}@Overridepublic int getCount() {return ls.size();}@Overridepublic Object getItem(int position) {return ls.get(position);}@Overridepublic long getItemId(int position) {return 0;}// 每個convert view都會調用此方法,獲得當前所需要的view樣式@Overridepublic int getItemViewType(int position) {int p = position;if (p == 0)return TYPE_1;else if (p == 1)return TYPE_2;elsereturn TYPE_3;}@Overridepublic int getViewTypeCount() {return 3;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder1 holder1 = null;ViewHolder2 holder2 = null;ViewHolder3 holder3 = null;int type = getItemViewType(position);if (convertView == null) {inflater = LayoutInflater.from(mContext);// 按當前所需的樣式,確定new的布局switch (type) {case TYPE_1:convertView = inflater.inflate(R.layout.item_runrank1,parent, false);holder1 = new ViewHolder1();holder1.rank1 = (TextView) convertView.findViewById(R.id.tv_list1_rank);holder1.time1 = (TextView) convertView.findViewById(R.id.tv_list1_time);convertView.setTag(holder1);break;case TYPE_2:convertView = inflater.inflate(R.layout.item_runrank2,parent, false);holder2 = new ViewHolder2();holder2.rank2 = (TextView) convertView.findViewById(R.id.tv_list2_rank);holder2.time2 = (TextView) convertView.findViewById(R.id.tv_list2_time);convertView.setTag(holder2);break;case TYPE_3:convertView = inflater.inflate(R.layout.item_runrank3,parent, false);holder3 = new ViewHolder3();holder3.rank3 = (TextView) convertView.findViewById(R.id.tv_list3_rank);holder3.time3 = (TextView) convertView.findViewById(R.id.tv_list3_time);convertView.setTag(holder3);break;default:break;}} else {switch (type) {case TYPE_1:holder1 = (ViewHolder1) convertView.getTag();break;case TYPE_2:holder2 = (ViewHolder2) convertView.getTag();break;case TYPE_3:holder3 = (ViewHolder3) convertView.getTag();break;}}// 設定資源switch (type) {case TYPE_1:holder1.rank1.setText("" + (position + 1));holder1.time1.setText(ls.get(position).get("time").toString());break;case TYPE_2:holder2.rank2.setText("" + (position + 1));holder2.time2.setText(ls.get(position).get("time").toString());holder2.totaldistance2.setText(ls.get(position)break;case TYPE_3:holder3.rank3.setText("" + (position + 1));holder3.time3.setText(ls.get(position).get("time").toString());break;}return convertView;}public class ViewHolder1 {TextView rank1;TextView time1;}public class ViewHolder2 {TextView rank2;TextView time2;}public class ViewHolder3 {TextView rank3;TextView time3;}}
使用方式:
聲明並定義自己的Adapter,在ListView中設定他的Adapter
private RunRankAdapter runRankAdapter; ArrayList<HashMap<String, Object>> runRank; ListView lv_runRank;runRank = new ArrayList<HashMap<String, Object>>(); runRankAdapter = new RunRankAdapter(this, runRank); lv_runRank = (ListView) findViewById(R.id.lv_runRank); lv_runRank.setAdapter(runRankAdapter);
還有一種方法:
在主布局檔案中包含一個LinearLayout. 並且設定android:orientation="vertical"
定義兩種不同的布局檔案,然後代碼中,根據不同條件調用.addview向LinearLayout載入就可以了