Android BaseAdapter与ListView的使用
Android BaseAdapter與ListView的使用
定義:BaseAdapterextends?Objectimplements?ListAdapter?SpinnerAdapter
BaseAdapter是抽象類,因此必須通過繼承才能使用,BaseAdapter是實現(xiàn)了ListAdapter和SpinnerAdapter兩個接口,當(dāng)然它也可以直接給ListView和Spinner等UI組件直接提供數(shù)據(jù)。
相關(guān)類結(jié)構(gòu)如下圖所示:在ListView的使用中,有時候還需要在里面加入按鈕等控件,實現(xiàn)單獨的操作。也就是說,這個ListView不再只是展示數(shù)據(jù),也不僅僅是這一行要來處理用戶的操作,而是里面的控件要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發(fā)現(xiàn)可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?▲圖4-35 BaseAdapter中的方法
使用BaseAdapter必須寫一個類繼承它,同時BaseAdapter是一個抽象類,繼承它必須實現(xiàn)它的方法。BaseAdapter的靈活性就在于它要重寫很多方法,看一下有哪些方法,如圖4-35所示為繼承自BaseAdapter的SpeechListAdapter所實現(xiàn)的方法,其中最重要的即為getView()方法。這些方法都有什么作用呢?我們通過分析ListView的原理來為讀者解答。
? 當(dāng)系統(tǒng)開始繪制ListView的時候,首先調(diào)用getCount()方法。得到它的返回值,即ListView的長度。然后系統(tǒng)調(diào)用getView()方法,根據(jù)這個長度逐一繪制ListView的每一行。也就是說,如果讓getCount()返回1,那么只顯示一行。而getItem()和getItemId()則在需要處理和取得Adapter中的數(shù)據(jù)時調(diào)用。那么getView如何使用呢?如果有10000行數(shù)據(jù),就繪制10000次?這肯定會極大的消耗資源,導(dǎo)致ListView滑動非常的慢,那應(yīng)該怎么做呢?通過一個例子來講解如何在使用BaseAdapter的時候優(yōu)化ListView的顯示。例子中將上一節(jié)中的ImageView換成Button,并且處理Button的點擊事件,其中對ListView的顯示做了優(yōu)化。
? 布局文件和上一例類同,讀者可以在光盤的工程目錄中查看,這里只給出Activity類。
publicclass MyListViewBase extends Activity {private ListView lv;//定義一個動態(tài)數(shù)組 ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */@Overridepublicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);lv = (ListView) findViewById(R.id.lv);MyAdapter mAdapter = new MyAdapter(this);//得到一個MyAdapter對象lv.setAdapter(mAdapter);//為ListView綁定Adapter/**為ListView添加點擊事件*/lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {Log.v("MyListViewBase", "你點擊了ListView條目" + arg2);//在LogCat中輸出信息 }});}/**添加一個得到數(shù)據(jù)的方法,方便使用*/private ArrayList<HashMap<String, Object>> getDate(){ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();/**為動態(tài)數(shù)組添加數(shù)據(jù)*/ for(int i=0;i<30;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemTitle", "第"+i+"行"); map.put("ItemText", "這是第"+i+"行"); listItem.add(map); }return listItem;}/** 新建一個類繼承BaseAdapter,實現(xiàn)視圖與數(shù)據(jù)的綁定*/privateclass MyAdapter extends BaseAdapter {private LayoutInflater mInflater;//得到一個LayoutInfalter對象用來導(dǎo)入布局 /**構(gòu)造函數(shù)*/public MyAdapter(Context context) {this.mInflater = LayoutInflater.from(context);}@Overridepublicint getCount() {return getDate().size();//返回數(shù)組的長度 }@Overridepublic Object getItem(int position) {returnnull;}@Overridepubliclong getItemId(int position) {return 0;}/**書中詳細(xì)解釋該方法*/ @Overridepublic View getView(finalint position, View convertView, ViewGroup parent) {ViewHolder holder;//觀察convertView隨ListView滾動情況 Log.v("MyListViewBase", "getView " + position + " " + convertView);if (convertView == null) {convertView = mInflater.inflate(R.layout.item,null);holder = new ViewHolder();/**得到各個控件的對象*/ holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);holder.text = (TextView) convertView.findViewById(R.id.ItemText);holder.bt = (Button) convertView.findViewById(R.id.ItemButton);convertView.setTag(holder);//綁定ViewHolder對象 }else{holder = (ViewHolder)convertView.getTag();//取出ViewHolder對象 }/**設(shè)置TextView顯示的內(nèi)容,即我們存放在動態(tài)數(shù)組中的數(shù)據(jù)*/ holder.title.setText(getDate().get(position).get("ItemTitle").toString());holder.text.setText(getDate().get(position).get("ItemText").toString());/**為Button添加點擊事件*/ holder.bt.setOnClickListener(new OnClickListener() {@Overridepublicvoid onClick(View v) {Log.v("MyListViewBase", "你點擊了按鈕" + position);//打印Button的點擊信息 }});return convertView;}}/**存放控件*/publicfinalclass ViewHolder{public TextView title;public TextView text;public Button bt;} }
運行效果如圖4-36所示。還需要注意的是,Button會搶奪ListView的焦點,需要將Button設(shè)置為沒有焦點。設(shè)置非常簡單,只需要在xml的Button標(biāo)簽下加入一行:android:focusable=“false”代碼就可以了。在LogCat觀察點擊后輸出的信息,如圖4-37所示。
? ? ? ? ? ??
參考資料:http://www.open-open.com/lib/view/open1339485728006.html?
總結(jié)
以上是生活随笔為你收集整理的Android BaseAdapter与ListView的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: URI和URLConnection类的区
- 下一篇: Android清单AndroidMani