ListView是Android中常用的重要組件之一,基本上所有軟件基本都會(huì)使用ListView,所以要對(duì)ListView非常熟悉。
為興平等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及興平網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、興平網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
先看看程序效果圖:
ListView的樣式很多,有純文字型,帶圖片顯示,帶按鈕的等等。本次演示一個(gè)帶圖片的ListView。
①布局文件:
在ListView程序中,布局文件相比其他普通控件會(huì)多出至少一個(gè),其原因是還需要一個(gè)關(guān)于ListView里面內(nèi)容條目的布局文件。
內(nèi)容條目的布局文件 listview_item.xml :
看了代碼應(yīng)該就明白了我上面說(shuō)的ListView內(nèi)容條目的布局指的就是
這樣一條條的布局文件
另外一個(gè)布局文件,整個(gè)android程序的總體布局文件 activity_main.xml :
只有一個(gè)
②A(yíng)ndroid代碼
MainActivity.java
package com.example.testlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.widget.SimpleAdapter; /** * 注意繼承的是ListActivity * @author jam * */ public class MainActivity extends ListActivity { private List
其中MyBaseAdapter.java代碼:
package com.example.testlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; /** * 繼承BaseAdapter * 相對(duì)于SimpleAdapter來(lái)說(shuō)顯得麻煩,但帶來(lái)了更多好處 * @author jam * */ public class MyBaseAdapter extends BaseAdapter { private LayoutInflater myInfalater; private List> list; public MyBaseAdapter(Context context, List > list) { super(); this.list = list; myInfalater = LayoutInflater.from(context); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int positionId) { return positionId; } //重要的重寫(xiě)方法 @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; if(convertView == null) { convertView = myInfalater.inflate(R.layout.listview_item, null); viewHolder = new ViewHolder(); viewHolder.avatar = (ImageView) convertView.findViewById(R.id.id_p_w_picpathview); viewHolder.title = (TextView) convertView.findViewById(R.id.id_tv_title); viewHolder.desc = (TextView) convertView.findViewById(R.id.id_tv_desc); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.avatar.setBackgroundResource((Integer) list.get(position).get("avatar")); viewHolder.title.setText((CharSequence) list.get(position).get("user_name")); viewHolder.desc.setText((CharSequence) list.get(position).get("user_ip")); return convertView; } private class ViewHolder { ImageView avatar; TextView title; TextView desc; } }
說(shuō)明
BaseAdapter是一個(gè)很常用的Adapter,是一個(gè)抽象類(lèi),需要重寫(xiě)很多方法。
在A(yíng)dapter中先調(diào)用getCount()方法,得到ListView的長(zhǎng)度,根據(jù)這個(gè)長(zhǎng)度逐一繪制ListView的每一行
onvertView相當(dāng)于一個(gè)緩存,開(kāi)始為0,當(dāng)有條目變?yōu)椴豢梢?jiàn),它緩存了它的數(shù)據(jù),后面再出來(lái)的條目只需要更新數(shù)據(jù)就可以了,這樣大大節(jié)省了系統(tǒng)資料的開(kāi)銷(xiāo)
ViewHolder的應(yīng)用 :
View的findViewById()方法也是比較耗時(shí)的,因此需要考慮只調(diào)用一次,之后就用convertView.getTag();方法來(lái)獲得ViewHolder對(duì)象。
通俗的說(shuō),inflate就相當(dāng)于將一個(gè)xml中定義的布局找出來(lái).
因?yàn)樵谝粋€(gè)Activity里如果直接用findViewById()的話(huà),對(duì)應(yīng)的是setConentView()的那個(gè)layout里的組件.
因此如果你的Activity里如果用到別的layout,比如對(duì)話(huà)框上的layout,你還要設(shè)置對(duì)話(huà)框上的layout里的組件(像圖片ImageView,文字TextView)上的內(nèi)容,你就必須用inflate()先將對(duì)話(huà)框上的layout找出來(lái),然后再用這個(gè)layout對(duì)象去找到它上面的組件。
另外這里有些BaseAdapter相關(guān)資料:
http://www.open-open.com/lib/view/open1339485728006.html
http://android.tgbus.com/Android/tutorial/201104/348009.shtml