Android ListView中 每一項都有不同的布局

來源:互聯網
上載者:User

實現代碼

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載入就可以了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.