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的時間,提高了效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章