android---listview

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值