使用ListView應該注意的地方
在ListView中設置Selector為null會(huì )報空指針?
mListView.setSelector(null);//空指針
試試下面這種:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
如何讓ListView初始化的時(shí)候就選中一項?
ListView需要在初始化好數據后,其中一項需要呈選中狀態(tài)。所謂"選中狀態(tài)"就是該項底色與其它項不同,setSelection(position)只能定位到某個(gè)item,但是無(wú)法改變底色呈高亮。setSelection(position)只能讓某個(gè)item顯示在可見(jiàn)Item的最上面(如果Item超過(guò)一屏的話(huà))! 就是所謂的firstVisibleItem啦!
如果想要實(shí)現效果可以在listview所綁定的adapter里的getView函數里去完成一些具體的工作??梢杂浵履阋吡恋哪莻€(gè)item的index,在getView函數里判斷index(也就是position),如果滿(mǎn)足條件則加載不同的背景。
ListView的右邊滾動(dòng)滑塊啟用方法?
很多開(kāi)發(fā)者不知道ListView列表控件的快速滾動(dòng)滑塊是如何啟用的,其實(shí)輔助滾動(dòng)滑塊只需要一行代碼就可以搞定,如果你使用XML布局只需要在ListView節點(diǎn)中加入 android:fastScrollEnabled="true" 這個(gè)屬性即可,而對于Java代碼可以通過(guò)myListView.setFastScrollEnabled(true); 來(lái)控制啟用,參數false為隱藏。
還有一點(diǎn)就是當你的滾動(dòng)內容較小,不到當前ListView的3個(gè)屏幕高度時(shí)則不會(huì )出現這個(gè)快速滾動(dòng)滑塊,該方法是AbsListView的基礎方法,可以在ListView或GridView等子類(lèi)中使用快速滾動(dòng)輔助。
1. 更新ListView中的數據,通過(guò)調用BaseAdapter對象的notifyDataSetChanged()方法:
mAdapter.notifyDataSetChanged();
2. 每個(gè)listview都有無(wú)效的位置,如第一行的前一行,最後一行的後一行,這個(gè)無(wú)效的位置是一個(gè)常量.
ListView.INVALID_POSITION
3. 有時(shí)我們需要在程序中通過(guò)點(diǎn)擊按鈕來(lái)控制ListView行的選中,這就用到了在程序中如何使用代碼來(lái)選擇ListView項.
mListView.requestFocusFromTouch();
mListView.setSelection(int index);
第一條語(yǔ)句並不是必須的,但是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點(diǎn)優(yōu)先級高的控件時(shí),那麼第一條語(yǔ)句是你必須加的.
4. 同樣的,若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點(diǎn)優(yōu)先級高的控件時(shí),ListView的setOnItemClickListener是不被執行的,這時(shí)你需要在你的xml文件中對這些控件添加 android:focusable="false" 注意這條語(yǔ)句要放在xml文件中修改,在代碼中使用是無(wú)效的.
5. 如何保持ListView的滾動(dòng)條一直顯示,不隱藏呢: xml文件中做如下修改 android:fadeScrollbars="false"
6. ListView本身有自己的按鍵事件,即你不需要設置方向鍵的標識,按下方向鍵ListView就會(huì )有默認的動(dòng)作,那如何進(jìn)行控制,編寫(xiě)自己的onKey呢,你需要在A(yíng)ctivity中重寫(xiě)dispatchKeyEvent(KeyEvent event);方法,在這裡面定義你自己的動(dòng)作就可以了
ListView 自定義滾動(dòng)條樣式:
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:stackFromBottom="true"http://從下開(kāi)始顯示條目
android:transcriptMode="normal"
android:fastScrollEnabled="true"
android:focusable="true"
android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
/>
//scrollbar_vertical_track,crollbar_vertical_thumb自定義的xml文件,放在Drawable中,track是指長(cháng)條,thumb是指短條
去掉ListView Selector選種時(shí)黃色底紋一閃的效果:
Xml代碼
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android=" <solid android:color="@android:color/transparent"/>
<corners android:radius="0dip" />
</shape>
//listview.setSelector(R.drawable.thisShape);
或者還有一種辦法:
在A(yíng)dapter中重寫(xiě)public boolean isEnabled(int position)方法,將其返回false就可以了,推薦采用此種辦法,具體見(jiàn)http://gundumw100.iteye.com/admin/blogs/850654
Java代碼
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return false;
}
ListView幾個(gè)比較特別的屬性
首先是stackFromBottom屬性,這只該屬性之后你做好的列表就會(huì )顯示你列表的最下面,值為true和false
android:stackFromBottom="true"
第二是transciptMode屬性,需要用ListView或者其它顯示大量Items的控件實(shí)時(shí)跟蹤或者查看信息,并且希望最新的條目可以自動(dòng)滾動(dòng)到可視范圍內。通過(guò)設置的控件transcriptMode屬性可以將Android平臺的控件(支持ScrollBar)自動(dòng)滑動(dòng)到最底部。
android:transcriptMode="alwaysScroll"
第三cacheColorHint屬性,很多人希望能夠改變一下它的背景,使他能夠符合整體的UI設計,改變背景背很簡(jiǎn)單只需要準備一張圖片然后指定屬性 android:background="@drawable/bg",不過(guò)不要高興地太早,當你這么做以后,發(fā)現背景是變了,但是當你拖動(dòng),或者點(diǎn)擊list空白位置的時(shí)候發(fā)現ListItem都變成黑色的了,破壞了整體效果。
如果你只是換背景的顏色的話(huà),可以直接指定android:cacheColorHint為你所要的顏色,如果你是用圖片做背景的話(huà),那也只要將android:cacheColorHint指定為透明(#00000000)就可以了
第四divider屬性,該屬性作用是每一項之間需要設置一個(gè)圖片做為間隔,或是去掉item之間的分割線(xiàn)android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一個(gè)圖片資源,如果不想顯示分割線(xiàn)則只要設置為android:divider="@drawable/@null" 就可以了
第五fadingEdge屬性,上邊和下邊有黑色的陰影android:fadingEdge="none" 設置后沒(méi)有陰影了~
第五scrollbars屬性,作用是隱藏listView的滾動(dòng)條,android:scrollbars="none"與setVerticalScrollBarEnabled(true);的效果是一樣的,不活動(dòng)的時(shí)候隱藏,活動(dòng)的時(shí)候也隱藏
第六fadeScrollbars屬性,android:fadeScrollbars="true" 配置ListView布局的時(shí)候,設置這個(gè)屬性為true就可以實(shí)現滾動(dòng)條的自動(dòng)隱藏和顯示。
如何在使用gallery在flinging拖動(dòng)時(shí)候不出現選擇的情況?
這時(shí)候需要注意使用
gallery.setCallbackDuringFling(false)
如何讓ListView自動(dòng)滾動(dòng)?
注意stackFromBottom以及transcriptMode這兩個(gè)屬性。類(lèi)似Market客戶(hù)端的低端不斷滾動(dòng)。
<ListView android:id="listCWJ"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
/>
如何遍歷listView 的的單選框?
Java代碼
ListView listView = (ListView)findViewById(R.id.配置文件中ListView的ID);
//全選遍歷ListView的選項,每個(gè)選項就相當于布局配置文件中的RelativeLayout
for(int i = 0; i < listView.getChildCount(); i++){
View view = listView.getChildAt(i);
CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);
cb.setChecked(true);
}
如何讓ListView中TextView的字體顏色跟隨焦點(diǎn)的變化?
我們通常需要ListView中某一項選中時(shí),他的字體顏色和原來(lái)的不一樣。 如何設置字體的顏色呢? 在布局文件中TextColor一項來(lái)設置顏色,但是不是只設置一種顏色,而是在不同的條件下設置不同的顏色: 下面是個(gè)例子:
Xml代碼
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="<item android:state_enabled="false" android:color="@color/orange"></item>
<item android:state_window_focused="false" android:color="@color/orange"></item>
<item android:state_pressed="true" android:color="@color/white"></item>
<item android:state_selected="true" android:color="@color/white"></item>
<item android:color="@color/orange"></item>
</selector>
在獲取焦點(diǎn)或者選中的情況下設置為白色,其他情況設置為橘黃色。
如何自定義ListView行間的分割線(xiàn)?
所有基于ListView或者說(shuō)AbsListView實(shí)現的widget控件均可以通過(guò)下面的方法設置行間距的分割線(xiàn),分割線(xiàn)可以自定義顏色、或圖片。
在ListView中我們使用屬性android:divider="#FF0000" 定義分隔符為紅色,當然這里值可以指向一個(gè)drawable圖片對象,如果使用了圖片可能高度大于系統默認的像素,可以自己設置高度比如6個(gè)像素android:dividerHeight="6px" ,當然在Java中ListView也有相關(guān)方法可以設置。
ListView不通過(guò)notifyDataSetChanged()更新指定的Item
Listview一般大都是通過(guò)notifyDataSetChanged()來(lái)更新listview,但通過(guò)notifyDataSetChanged()會(huì )把界面上現實(shí)的的item都重繪一次,這樣會(huì )影響ui性能。
可以通過(guò)更新指定的Item提高效率,偽代碼如下:
Java代碼
private void updateView(int itemIndex){
int visiblePosition = yourListView.getFirstVisiblePosition();
View v = yourListView.getChildAt(itemIndex - visiblePosition);//Do something fancy with your listitem view
TextView tv = (TextView)v.findViewById(R.id.sometextview);
tv.setText("Hi! I updated you manually");
}
讓ListView中長(cháng)按某些Item時(shí)能彈出contextMenu,有些不能
定義了一個(gè)listView,并為他設置了setOnCreateContextMenuListener的監聽(tīng),但這樣做只能使這個(gè)listView中的所有項在長(cháng)按的時(shí)候彈出contextMenu 。
有時(shí)希望的是有些長(cháng)按時(shí)能彈出contextMenu,有些不能。解決這個(gè)問(wèn)題的辦法是為這個(gè)listView設置setOnItemLongClickListener監聽(tīng),然后實(shí)現
Java代碼
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
if(id == 1){
return true;
}
return false;
}
如果這一項的id=1,就不能長(cháng)按。 這樣就可以了
ListView底部分隔線(xiàn)的問(wèn)題
在工作中遇到了一個(gè)難題,就是一個(gè)listView在最下面的一個(gè)item下面沒(méi)有分割線(xiàn),要求是必須得有這條分割線(xiàn)。經(jīng)過(guò)一通研究發(fā)現了這個(gè)奇怪的現象:
1. ListActivity有這條底部分割線(xiàn)。
2.在A(yíng)ctivity中只有listview,沒(méi)有別的控件的話(huà)也會(huì )有。
其實(shí)ListActivity也是一個(gè)Activity,只不過(guò)在其中使用了SetContentView(listView)方法設置了一個(gè)listView作為其顯示的View而已。所以結論就是只要這個(gè)activity調用了SetContentView(listView)就會(huì )有這條底部分割線(xiàn)。
那么什么情況下才不會(huì )有這條分割線(xiàn)呢?在A(yíng)ctivity中如果調用setContentView(View)而ListView只是內嵌入到這個(gè)View的話(huà)有可能會(huì )沒(méi)有這條分割線(xiàn)。
分析其原因:通過(guò)加斷點(diǎn)調試發(fā)現在listView中,所有的分割線(xiàn)都是通過(guò)畫(huà)一個(gè)很窄的矩形來(lái)實(shí)現的,但是在畫(huà)分割線(xiàn)前都會(huì )都會(huì )判斷目前的位置A和listView的長(cháng)度B,如果A=B了,那么就不會(huì )畫(huà)這條分割線(xiàn)了。但是將Listview嵌入到一個(gè)View中,一般會(huì )設置為高度為wrap_content,這種情況下,最后那條分割線(xiàn)的位置剛好等于listView的高度,所以系統不會(huì )畫(huà)上這條分割線(xiàn)。那要怎么樣才會(huì )畫(huà)上呢?很簡(jiǎn)單,將ListView的高度設置為fill_partent就可以了。
當然以上所說(shuō)的都是item很少的情況下,如果item很多以至于必須顯示滾動(dòng)條的話(huà),那最后一個(gè)item下面是肯定不會(huì )有分割線(xiàn)了。
聯(lián)系客服