仿通讯录需要用到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的时间,提高了效率。