Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲

ListView

編輯:關於Android編程

1.ListView和Adapter

1)ListView就是一個能數據集合以動態滾動的方式展示到用戶界面上的View,即:以列表的形式展示具體內容,並且能夠根據數據的長度自適應顯示。 2)ListView和數據是分開的,不直接接觸。而是通過Adapter(適配器)加載到屏幕。也就是說Adapter相當於是數據和View之間的橋梁。Adapter負責為每一個數據項制作View。
\

2.ListView工作原理

1)在運行時ListView會針對數據項向Adapter要View,從而來加載到界面上,那麼,難道每一個item,Adapter都會重新創建一個視圖嗎?答案很明顯是不可能的。 2)為了能夠更快更省空間的顯示,Android准備了一個叫做Recycler(循環)的組件。假如你的屏幕只能顯示七個item。那麼ListView只會創建八個item的視圖。當第一個item出去,離開屏幕的時候,這個item的view就會被拿來重用,顯示下一個item的內容。

3.繼承BaseAdapter來使用ListView

1)BaseAdapter是個抽象類,繼承它能很方便的來使用ListView
步驟: 2)MyDataAdapter extends BaseAdapter繼承適配器類 3)添加數據源引用
計數器:counter = 0
數據源:List mData = null;
//上下文:Context mContext = null
//構造函數,兩個參數一個上下文,一個數據源,一個計數器設置
//覆寫如下回調函數
//1.數據源中的數據對象個數
public int getCount() {
    return mData.size();
}
//2.指定位置處的具體數據源對象
public Object getItem(int position) {
    return mData.get(position);
}
//3.數據源對象的Id,如果數據源對象自己沒有定義Id,則可以簡單地返回其在數據源中的位置
public long getItemId(int position) {
    return position;
}
//4.每當Android ListView需要顯示一行時,它會調用此方法,這裡面存在四個邏輯
public View getView(int position, View convertView, ViewGroup parent) {
        Log.d(TAG, "顯示:" + position + "行,調用getView()" + "參數convertView==null?" + (convertView == null));

        View rootView = null;
        //1)如果沒有可以重用的控件,convertView為空,加載布局創建View,convertView 本質就是一個View緩沖器
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            rootView = inflater.inflate(R.layout.my_list_item, parent, false); //加載布局,創建View
            rootView.setTag(position);
            Log.d(TAG, "實例化rootView,保存到Tag中的值為:" + position);
            counter++;
            Log.d(TAG, "控件實例化個數:" + counter);
        } else {
            //2)控件己經被創建過,直接重用,若不空,則直接通過position,獲取list中的item,直接替換view中的內容。
            rootView = convertView;
        }

        //3)依據位置提取相應的數據源對象
        MyDataClass item = mData.get(position);

        //4)獲取用於顯示內容的控件的引用,findViewById()這個函數執行代價很大。所以不建議用這種方式,每次都加載控件
        TextView titleTextView = (TextView) rootView.findViewById(R.id.tvTitle);
        TextView detailTextView = (TextView) rootView.findViewById(R.id.tvDetail);

        //5)設置顯示內容
        titleTextView.setText(item.getTitle());
        detailTextView.setText(item.getDetail() + " 本行Tag中保存的值為:" + rootView.getTag());

        return rootView;
    }
}
4.優化之ViewHolder設計模式
1)創建一個內部類ViewHolder保存控件 holder view inside,只加載View的時候使用findViewById()方法 2)Tags can also be used to store data within a view without
resorting to another data structure.使用View的setTag()方法保存ViewHolder。當convertView不為空的時候,直接取出來即可.
public View getView(int position, View convertView, ViewGroup parent) { //1.回調方法中創建一個ViewHolder內部類,其外部方法體中獲取其引用
        ViewHolder holder=null;
        View rootView=convertView;
        if(convertView==null){
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        rootView = layoutInflater.inflate(R.layout.phoneinfo_item, parent, false);
    //2.加載新布局,初始化ViewHolder,並保存控件
        holder=new ViewHolder();
        holder.nameText= (TextView) rootView.findViewById(R.id.nameText);
        holder.numberText= (TextView) rootView.findViewById(R.id.numberText);
    //3.ViewHolder緩存控件數據引用,也是數據,控件類型的,需要view.setTag設置
        rootView.setTag(holder);
        }
        else {
        holder= (ViewHolder) rootView.getTag();
        }
        PhoneInfo phoneInfo = phoneInfoList.get(position);
    //4.使用ViewHolder中保存的控件類 進行操作
        holder.nameText.setText(phoneInfo.getPhoneName());
        holder.numberText.setText(phoneInfo.getPhoneNumber());

        return rootView;
        }
// 寫一個私有ViewHolder類,裡面存放控件簽名
private static class ViewHolder {
    public TextView nameText =null;
    public TextView numberText=null;
}
5.含有多種視圖的布局ListView
1)如果你要加載多種布局那麼首先你一定重寫這兩個方法,注意!type一定要從0開始!!
@Override
public int getItemViewType(int position) {
        BaseModel baseModel=models.get(position);
        int type=baseModel.getType();
        return type;
 }
@Override
public int getViewTypeCount() {
        return 2;
}

2)有幾個布局,就定義幾個布局類,一個基類,弄多個ViewHolder保存即可。

6.ListView的屬性
http://blog.csdn.net/p106786860/article/details/10596339
原圖,不添加任何屬性:
\

1)屬性一:android:stackFromBottom=”true”//在ListView和GridView中使用,使它們的內容從底部開始顯示。

2)屬性二:
android:stackFromBottom=”true”
android:transcriptMode=”alwaysScroll”
android:transcriptMode屬性:設置列表的transcriptMode模式,該模式指定列表添加新的選項的時候,是否自動滑動到底部,顯示新的選項。
disabled:取消transcriptMode模式,默認的
normal:當接受到數據集合改變的通知,並且僅僅當最後一個選項已經顯示在屏幕的時候,自動滑動到底部。
alwaysScroll:無論當前列表顯示什麼選項,列表將會自動滑動到底部顯示最新的選項。

3)屬性三:android:divider屬性:列表之間繪制的顏色或者圖片。一般開發中用於分隔表項。
在實際開發過程中,如果你不想要列表之間的分割線,可以設置屬性為@null
android:divider=”@null” 4)屬性四:
android:fadingEdge屬性:設置列表的陰影
android:cacheColorHint屬性:該屬性在官方文檔和個資料中找不到比較好的描述;根據實際的體驗,當你設置的ListView的背景時,應該設置該屬性為“#00000000”(透明),不然在滑動的時候,列表的顏色會變黑或者背景圖片小時的情況!
1.          android:cacheColorHint="#000000ff"   
2.      android:fadingEdge="vertical"    
3.      android:fadingEdgeLength="40dp"

5)屬性五:fastScrollEnabled屬性:啟用快速滑動條,它能快速的滑動列表。但在實際的測試中發現,當你的數據比較小的時候,是不會顯示快速滾動條。
android:fastScrollEnabled=”true”

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved