ListView(列表視圖)
1.常用屬性和方法
? ? ? ? ? ? ?footerDividersEnabled:是否在footerView(表尾)前繪制一個分隔條,默認(rèn)為true
? ? ? ? ? ? ?headerDividersEnabled:是否在headerView(表頭)前繪制一個分隔條,默認(rèn)為true
? ? ? ? ? ? ?divider:設(shè)置分隔條,可以用顏色分割,也可以用drawable資源分割
? ? ? ? ? ? ?dividerHeight:設(shè)置分隔條的高度
? ? ? ? ? ? ?android:scrollbars="none" 隱藏滑動條
? ? ? ? ? ? ?stackFromBottom:是否設(shè)置列表從底部開始顯示
? ? ? ? ? ? ?addHeaderView(View v):添加headView(表頭),括號中的參數(shù)是一個View對象
? ? ? ? ? ? ?addFooterView(View v):添加footerView(表尾),括號中的參數(shù)是一個View對象
? ? ? ? ? ? ?addHeaderView(headView, null, false):和前面的區(qū)別:設(shè)置Header是否可以被選中
? ? ? ? ? ? ?addFooterView(View,view,false):同上
? ? ? ? ? ? ?setEmptyView(View v) :設(shè)置空布局(必須再當(dāng)前View hierarchy)
? ? ? ? ? ? ?注:1.使用這個addHeaderView方法必須放在listview.setAdapter前面,否則會報錯
? ? ? ? ? ? ? ? ? ? ?2.positon是從表頭開始算的,添加了表頭糕珊,data[0]=表頭
? ? ? ? ? ? ? ? ? ? 3.setEmptyView(View v):兩種方式設(shè)置剑鞍,否則setEmptyView不會生效.
2.事件
? ? ? ? ? ? listview.setOnItemClickListener();
? ? ? ? ? ? public void onItemClick(AdapterView<?>?parent,View view,int position,long id){}
3.ListView焦點問題
情景:當(dāng)listview的item上有Button锹锰,CheckBox箕宙,EditText等控件時,ListView的item點擊不了也觸發(fā)不了onItemClick的方法
? ? ? ? ? ?此時ListView的焦點被其他控件搶了
方法1:為搶占了焦點的控件設(shè)置:android:focusable="false"
? ? ? ? ? ? ?缺點:對EditText無效(可以獲取焦點但瞬間失去焦點位他,也不會彈出小鍵盤)
方法2(最優(yōu)):在Item布局的根節(jié)點添加android:descendantFocusability="blocksDescendants"
? ? ? ? ? ? ? ? ? ? ? ? ? ? beforeDescendants:viewgroup會優(yōu)先其子類控件而獲取到焦點
? ? ? ? ? ? ? ? ? ? ? ? ? ? afterDescendants:viewgroup只有當(dāng)其子類控件不需要獲取焦點時才獲取焦點
? ? ? ? ? ? ? ? ? ? ? ? ? ? blocksDescendants:viewgroup會覆蓋子類控件而直接獲得焦點
4.ListView之checkbox錯位問題
ListView上可見的Item處于內(nèi)存中,其他Item則放在這個Recycler中产场,第一次加載item時鹅髓,當(dāng)前頁面中的convertView都為NULL,當(dāng)滾出屏幕京景,這是時候ConvertView不為空窿冯,所以新的一項會復(fù)用這個ConvertView(如果第一項被checked,新出來的第8項由于復(fù)用也checked)
解決方法:記錄當(dāng)前item中checkbox的狀態(tài)确徙,初始化進行判斷醒串,設(shè)置是否選中
? ? ? ? ? ? ? ? ? eg:放到一個HashMap中执桌, 每次初始化的時候根據(jù)postion取出對應(yīng)的boolean值,然后再進行checkbox的狀態(tài)設(shè)置
5.ListView的數(shù)據(jù)更新問題
使用notifyDataSetChanged()方法通知數(shù)據(jù)更新厦凤,該方法會判斷是否需要重新渲染鼻吮,僅會渲染View狀態(tài)發(fā)生變化的那個Item
6.ListView Item多布局的實現(xiàn)
注:type值的定義要從0開始
BaseAdapter優(yōu)化
原因:有多少item就會調(diào)用多少次getView, 每次都是新inflate一個View较鼓,都要進行這個XML的解析椎木,這樣會很浪費資源
優(yōu)化方法:1.復(fù)用ConvertView(復(fù)用布局,這個convertView是系統(tǒng)提供給我們的可供服用的View 的緩存對象)
? ? ? ? ? ? ? ? ? 2.ViewHolder重用組件(防止每次findview)
注:修飾ViewHolder的 static博烂,加靜態(tài)是為了在多個地方使用這個 Holder的時候香椎,類只需加載一次,如果只是使用了一次禽篱,加不加也沒所謂