仿通訊錄需要用到listview,記錄一下使用listview的一些知識
1.listview使用
(1)佈局文件:聲明一個listview即可。
(2)數據定義,定義了一個MembersInfo類來存儲聯繫人的變量和方法:
MembersInfo.java
package com.example.contactslistview;
public class MembersInfo {
private String name; //顯示的數據
private String firstLetter; //顯示數據拼音的首字母
private String phoneNumber;//顯示電話號碼
private int ImageId;//頭像圖片ID
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public int getImageId(){
return ImageId;
}
public void setImageId(int ImageId){
this.ImageId=ImageId;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getFirstLetter() {
return firstLetter;
}
public void setFirstLetter(String firstLetter) {
this.firstLetter = firstLetter;
}
}
(3)適配器,把數據映射到listview中的媒介,也就是listview中每一行的數據,包括圖片,文字等,可以簡單理解成一個新的layout。
getview部分:
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
final MembersInfo mContent = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.member_item, null);
viewHolder.tvFirstLetter = (TextView) view.findViewById(R.id.firstletter);
viewHolder.tvHead = (ImageView) view.findViewById(R.id.contact_head);
viewHolder.tvName = (TextView) view.findViewById(R.id.contact_name);
viewHolder.tvPhone = (TextView) view.findViewById(R.id.contact_phone);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
// 根據position獲取分類的首字母
int section = getSectionForPosition(position);
// 如果當前位置等於該分類首字母的位置 ,則認爲是第一次出現
if (position == getPositionForSection(section)) {
viewHolder.tvFirstLetter.setVisibility(View.VISIBLE);
viewHolder.tvFirstLetter.setText(mContent.getFirstLetter());
} else {
viewHolder.tvFirstLetter.setVisibility(View.GONE);
}
viewHolder.tvName.setText(this.list.get(position).getName());
viewHolder.tvPhone.setText(this.list.get(position).getPhoneNumber());
viewHolder.tvHead.setImageResource(this.list.get(position).getImageId());
return view;
}
聲明一個MembersAdapter類實現BaseAdapter,重寫getview方法,即讓listview顯示特定的內容。
(4)將數據,listview和適配器關聯
SourceDataList = new ArrayList<MembersInfo>();
adapter = new MembersAdapter(this, SourceDataList);
listview.setAdapter(adapter);
結果:
①最上方是一個tabhost,有兩個部分;
②下方是listview和sidebar部分;
③點擊list中的一項彈出一個對話框,顯示名稱(名稱是隨機產生的字符串,拼音不會處理。。)。
2.listview的優化
作業要求顯示10000條聯繫人不卡,但是listview本身就已經幫我們做好了優化,參考:
①http://blog.csdn.net/linxcool/article/details/9793355
②http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html
③http://my.oschina.net/u/1463230/blog/269252
主要就是使用了convertview和viewholder ,第一次加載列表項的時候需要花費時間較多,後面的加載時間比較少,因爲convertview緩存了結構,滑動listview只是做了數據更新,viewholder減少了findviewById的時間,提高了效率。