ListView的Item中含有Button時沒法響應onItemClick()?
解決辦法就是將Button的Focus設置爲非默認獲取
方法一:將ListView的Item Layout的子控件focusable屬性設置爲false
方法二(推薦):對Item Layout的根控件android:descendantFocusability="blocksDescendant"
方法三:在實現ListView的Adapter的getView方法時,將button.setFocusable(false);
在ListView中設置Selector爲null會報空指針?
mListView.setSelector(null);//空指針
試試下面這種:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
如何讓ListView初始化的時候就選中一項?
ListView須要在初始化好數據後,其中一項須要呈選中狀態。所謂"選中狀態"就是該項底色與其它項不一樣,setSelection(position)只能定位到某個item,可是沒法改變底色呈高亮。setSelection(position)只能讓某個item顯示在可見Item的最上面(若是Item超過一屏的話)! 就是所謂的firstVisibleItem啦!
若是想要實現效果能夠在listview所綁定的adapter裏的getView函數裏去完成一些具體的工做。能夠記下你要高亮的那個item的index,在getView函數裏判斷index(也就是position),若是知足條件則加載不一樣的背景。
或者:
android
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 函數
getListView().setItemChecked(position, true); 佈局
ListView的右邊滾動滑塊啓用方法?
不少開發者不知道ListView列表控件的快速滾動滑塊是如何啓用的,其實輔助滾動滑塊只須要一行代碼就能夠搞定,若是你使用XML佈局只須要在ListView節點中加入 android:fastScrollEnabled="true" 這個屬性便可,而對於Java代碼能夠經過myListView.setFastScrollEnabled(true); 來控制啓用,參數false爲隱藏。
還有一點就是當你的滾動內容較小,不到當前ListView的3個屏幕高度時則不會出現這個快速滾動滑塊,該方法是AbsListView的基礎方法,能夠在ListView或GridView等子類中使用快速滾動輔助。
1. 更新ListView中的數據,通過調用BaseAdapter對象的notifyDataSetChanged()方法:
mAdapter.notifyDataSetChanged();
2. 每個listview都有無效的位置,如第一行的前一行,最後一行的後一行,這個無效的位置是一個常量.
ListView.INVALID_POSITION
3. 有時我們須要在程序中通過點擊按鈕來控制ListView行的選中,這就用到了在程序中如何使用代碼來選擇ListView項.
mListView.requestFocusFromTouch();
mListView.setSelection(int index);
第一條語句並不是必須的,可是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控件時,那麼第一條語句是你必須加的.
4. 同樣的,若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控件時,ListView的setOnItemClickListener是不被執行的,這時你須要在你的xml文件中對這些控件添加 android:focusable="false" 注意這條語句要放在xml文件中修改,在代碼中使用是無效的.
5. 如何保持ListView的滾動條一直顯示,不隱藏呢: xml文件中作以下修改 android:fadeScrollbars="false"
6. ListView自己有本身的按鍵事件,即你不須要設置方向鍵的標識,按下方向鍵ListView就會有默認的動做,那如何進行控制,編寫本身的onKey呢,你須要在Activity中重寫dispatchKeyEvent(KeyEvent event);方法,在這裡面定義你本身的動做就能夠了
ListView 自定義滾動條樣式:
<ListView android:id="@android :id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:stackFromBottom="true"//從下開始顯示條目
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是指長條,thumb是指短條
去掉ListView Selector選種時黃色底紋一閃的效果:
性能
<?xml version="1.0" encoding="utf-8"?> ui
<shape xmlns:android="http://schemas.android.com/apk/res/android"> this
<solid android:color="@android :color/transparent"/> spa
<corners android:radius="0dip" /> .net
</shape>
//listview.setSelector(R.drawable.thisShape);
或者還有一種辦法:
在Adapter中重寫public boolean isEnabled(int position)方法,將其返回false就能夠了,推薦採用此種辦法
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return false;
}
ListView幾個比較特別的屬性
首先是stackFromBottom屬性,這隻該屬性以後你作好的列表就會顯示你列表的最下面,值爲true和false
android:stackFromBottom="true"
第二是transciptMode屬性,須要用ListView或者其它顯示大量Items的控件實時跟蹤或者查看信息,而且但願最新的條目能夠自動滾動到可視範圍內。經過設置的控件transcriptMode屬性能夠將Android平臺的控件(支持ScrollBar)自動滑動到最底部。
android:transcriptMode="alwaysScroll"
第三cacheColorHint屬性,不少人但願可以改變一下它的背景,使他可以符合總體的UI設計,改變背景背很簡單隻須要準備一張圖片而後指定屬性 android:background="@drawable/bg",不過不要高興地太早,當你這麼作之後,發現背景是變了,可是當你拖動,或者點擊list空白位置的時候發現ListItem都變成黑色的了,破壞了總體效果。
若是你只是換背景的顏色的話,能夠直接指定android:cacheColorHint爲你所要的顏色,若是你是用圖片作背景的話,那也只要將android:cacheColorHint指定爲透明(#00000000)就能夠了
第四divider屬性,該屬性做用是每一項之間須要設置一個圖片作爲間隔,或是去掉item之間的分割線android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一個圖片資源,若是不想顯示分割線則只要設置爲android:divider="@drawable/@null" 就能夠了
第五fadingEdge屬性,上邊和下邊有黑色的陰影android:fadingEdge="none" 設置後沒有陰影了~
第五scrollbars屬性,做用是隱藏listView的滾動條,android:scrollbars="none"與setVerticalScrollBarEnabled(true);的效果是同樣的,不活動的時候隱藏,活動的時候也隱藏
第六fadeScrollbars屬性,android:fadeScrollbars="true" 配置ListView佈局的時候,設置這個屬性爲true就能夠實現滾動條的自動隱藏和顯示。
如何在使用gallery在flinging拖動時候不出現選擇的狀況?
這時候須要注意使用
gallery.setCallbackDuringFling(false)
如何讓ListView自動滾動?
注意stackFromBottom以及transcriptMode這兩個屬性。相似Market客戶端的低端不斷滾動。
<ListView android:id="listCWJ"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
/>
如何遍歷listView 的的單選框?
ListView listView = (ListView)findViewById(R.id.配置文件中ListView的ID);
//全選遍歷ListView的選項,每一個選項就至關於佈局配置文件中的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的字體顏色跟隨焦點的變化?
咱們一般須要ListView中某一項選中時,他的字體顏色和原來的不同。 如何設置字體的顏色呢? 在佈局文件中TextColor一項來設置顏色,可是不是隻設置一種顏色,而是在不一樣的條件下設置不一樣的顏色: 下面是個例子:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/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>
在獲取焦點或者選中的狀況下設置爲白色,其餘狀況設置爲橘黃色。
如何自定義ListView行間的分割線?
全部基於ListView或者說AbsListView實現的widget控件都可以經過下面的方法設置行間距的分割線,分割線能夠自定義顏色、或圖片。
在ListView中咱們使用屬性android:divider="#FF0000" 定義分隔符爲紅色,固然這裏值能夠指向一個drawable圖片對象,若是使用了圖片可能高度大於系統默認的像素,能夠本身設置高度好比6個像素android:dividerHeight="6px" ,固然在Java中ListView也有相關方法能夠設置。
ListView不經過notifyDataSetChanged()更新指定的Item
Listview通常大都是經過notifyDataSetChanged()來更新listview,但經過notifyDataSetChanged()會把界面上現實的的item都重繪一次,這樣會影響ui性能。
能夠經過更新指定的Item提升效率,僞代碼以下:
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中長按某些Item時能彈出contextMenu,有些不能
定義了一個listView,併爲他設置了setOnCreateContextMenuListener的監聽,但這樣作只能使這個listView中的全部項在長按的時候彈出contextMenu 。
有時但願的是有些長按時能彈出contextMenu,有些不能。解決這個問題的辦法是爲這個listView設置setOnItemLongClickListener監聽,而後實現
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
if(id == 1){
return true;
}
return false;
}
若是這一項的id=1,就不能長按。 這樣就能夠了
ListView底部分隔線的問題
在工做中遇到了一個難題,就是一個listView在最下面的一個item下面沒有分割線,要求是必須得有這條分割線。通過一通研究發現了這個奇怪的現象:
1. ListActivity有這條底部分割線。
2.在Activity中只有listview,沒有別的控件的話也會有。
其實ListActivity也是一個Activity,只不過在其中使用了SetContentView(listView)方法設置了一個listView做爲其顯示的View而已。因此結論就是隻要這個activity調用了SetContentView(listView)就會有這條底部分割線。
那麼什麼狀況下才不會有這條分割線呢?在Activity中若是調用setContentView(View)而ListView只是內嵌入到這個View的話有可能會沒有這條分割線。
分析其緣由:經過加斷點調試發如今listView中,全部的分割線都是經過畫一個很窄的矩形來實現的,可是在畫分割線前都會都會判斷目前的位置A和listView的長度B,若是A=B了,那麼就不會畫這條分割線了。可是將Listview嵌入到一個View中,通常會設置爲高度爲wrap_content,這種狀況下,最後那條分割線的位置恰好等於listView的高度,因此係統不會畫上這條分割線。那要怎麼樣纔會畫上呢?很簡單,將ListView的高度設置爲fill_partent就能夠了。
固然以上所說的都是item不多的狀況下,若是item不少以致於必須顯示滾動條的話,那最後一個item下面是確定不會有分割線了。