Android中BaseAdapter的理解
來源:互聯網
上載者:User
最近做一個項目,項目中用到了ListView,ListView最重要的就是綁定資料,這個資料由Adapter來提供,這裡我重寫了BaseAdapter這個類來實現自己的menuAdapter代碼如下:package org.leepood.lanorder;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.leepood.xmlparse.xmlParse;import android.view.LayoutInflater;import android.content.Context;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class menuAdapter extends BaseAdapter { private LayoutInflatermInflater; private Context context;privateList<Menu> menus;publicmenuAdapter(List<Menu> menus,Context context){this.menus=menus;this.mInflater =LayoutInflater.from(context);}public int getCount() {return menus.size();}public Object getItem(intposition) {return menus.get(position);}public long getItemId(intposition) {return position;}public View getView(intposition, View convertView, ViewGroup parent) {menuAdapterViewholder = null;//自訂的一個類用來緩衝convertviewif (convertView ==null) {holder=newmenuAdapterView();convertView =mInflater.inflate(R.layout.menu, null);holder.name =(TextView)convertView.findViewById(R.id.txtname);holder.price =(TextView)convertView.findViewById(R.id.txtprice);holder.description =(TextView)convertView.findViewById(R.id.txtdescription);convertView.setTag(holder);//Log.i("tag", "run once");}else {holder = (menuAdapterView)convertView.getTag();}holder.name.setText(String.valueOf(position));holder.price.setText((String)menus.get(position).getPrice());holder.description.setText((String)menus.get(position).getDescription());return convertView;} }其中BaseAdapter需要重寫的方法:getCount(),getItem(int position),getItemId(int position),getView(int position, View convertView, ViewGroup parent)listView在開始繪製的時候,系統首先調用getCount()函數,根據他的傳回值得到 listView的長度,然後根據這個長度,調用getView()逐一繪製每一行。如果你的 getCount()傳回值是0的話,列表將不顯示同樣return 1,就只顯示一行。系統顯示列表時,首先執行個體化一個適配器(這裡將執行個體化自訂的適配器)。當手動完成適配時,必須手動映射資料,這需要重寫getView()方 法。系統在繪製列表的每一行的時候將調用此方法。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文 件中inflate來的布局。我們用LayoutInflater的方法將定義好的item.xml檔案提取成View執行個體用來顯示。然後將xml檔案中 的各個組件執行個體化(簡單的findViewById()方法)。這樣便可以將資料對應到各個組件上了。但是按鈕為了響應點擊事件,需要為它添加點擊監聽 器,這樣就能捕獲點擊事件。至此一個自訂的listView就完成了,現在讓我們回過頭從新審視這個過程。系統要繪製ListView了,他首先獲得要 繪製的這個列表的長度,然後開始繪製第一行,怎麼繪製呢?調用getView()函數。在這個函數裡面首先獲得一個View(實際上是一個 ViewGroup),然後再執行個體並設定各個組件,顯示之。好了,繪製完這一行了。那再繪製下一行,直到繪完為止。