關于ListView加入HeaderView之后,點擊條目時獲得position參數移位的BUG修正
?????? 今天遇到一個問題,在ListView的時候,要在首部加一個輪播圖組件,調用的是ListView的addHeaderView(View v, Object data, boolean isSelectable)方法,這個方法可以把一個view放置到Listview的頂部顯示,也可以多次調用,使得多個view按照添加的順序,依次排列在ListView的頂部顯示。
???????
??????? 這樣做了之后是顯示是沒問題的,但是遇到一個問題就是在ListView的Adapter的構造方法中,要添加ListView的條目點擊事件:mListView.setOnItemClickListener(this);
??????? 然后在Adapter里面實現onItemClick(AdapterView<?> parent, View view, int position,long id)方法,在通過position取數據的時候發現一個問題,就是點擊的條目錯位了,點擊一個條目,結果響應事件變成了下一個條目對應的事件。
??????? 經過探查之后發現,本來ListView條目的position是從0開始計算的:0,1,2...這樣,但是添加了一個Header之后,position變成了從1開始,于是需要手動修正一下這個postion的值。
??????? 好在Android中有提供一個對應的API來得到HeaderView的數量,那就是ListView中的一個方法:getHeaderViewsCount(),這個方法可以得到這個ListView添加了多少個HeaderView,然后我們需要做的只是在使用position之前,修正一下:
FloatingActionButton
一個類似Android版Google+浮動功能按鈕的控件,可以響應ListView的滾動事件。當列表向上滾動的時候會自動顯示,向下滾動的時候自動隱藏。
項目地址: https://github.com/makovkastar/FloatingActionButton
Android實現自適應正方形GridView
http://blog.chengyunfeng.com/?p=465
Read more: http://blog.chengyunfeng.com/?p=465#ixzz3REioavcX
關于addHeaderView,addFooterView的問題
當listview需要添加headerview時,可以通過調用listview的addHeaderView(headView, null, false) 方法,該方法還有一個重載方法 addHeaderView(headView);這兩個方法的區別是前一個方法可以控制header是否可以被selected,如果不想被selected則將第三個參數設置成false;
addHeaderView方法必須放在listview.setadapter前面,意思很明確就是如果想給listview添加頭部則必須在給其綁定adapter前添加,否則會報錯。原因是當我們在調用setAdapter方法時會android會判斷當前listview是否已經添加header,如果已經添加則會生成一個新的tempadapter,這個新的tempadapter包含我們設置的adapter所有內容以及listview的header和footer。所以當我們在給listview添加了header后在程序中調用listview.getadapter時返回的是tempadapter而不是我們通過setadapter傳進去的adapter。如果沒有設置adapter則tempadapter與我們自己的adapter是一樣的。listview.getadapter().getcount()方法返回值會比我們預期的要大,原因是添加了header。
接著上面的tempadapter說,我們自定義adapter里面的getitem方法里面返回的position是不包括header的,是我們自定義adapter中數據position編號從0開始,也就是說與我們傳進去的list的位置是一樣的。
但是在ListView的onItemClick方法中:
position是當前click的位置,這個位置是指在tempadapter中的位置,從0開始如果ListView中添加了header則0代表header。所以如果要得到ListView的第一條數據,就必須position-1
ListView的Item中含有Button時無法響應onItemClick()?
解決辦法就是將Button的Focus設置為非默認獲取
方法一:將ListView的Item Layout的子控件focusable屬性設置為false
方法二(推薦):對Item Layout的根控件android:descendantFocusability="blocksDescendant" ,對應的方法為:setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);??
方法三:在實現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),如果滿足條件則加載不同的背景。
偽代碼:
或者:
或者:
http://www.eoeandroid.com/thread-535829-1-1.html
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"http://從下開始顯示條目
??????? 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選種時黃色底紋一閃的效果:
或者直接:gridView.setSelector(android.R.color.transparent);
或者還有一種辦法:
在Adapter中重寫public boolean isEnabled(int position)方法,將其返回false就可以了,推薦采用此種辦法,但是這樣的話item不響應點擊事件了,具體見 http://gundumw100.iteye.com/admin/blogs/850654
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中TextView的字體顏色跟隨焦點的變化?
我們通常需要ListView中某一項選中時,他的字體顏色和原來的不一樣。 如何設置字體的顏色呢? 在布局文件中TextColor一項來設置顏色,但是不是只設置一種顏色,而是在不同的條件下設置不同的顏色: 下面是個例子:
如何自定義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提高效率,偽代碼如下:
讓ListView中長按某些Item時能彈出contextMenu,有些不能
定義了一個listView,并為他設置了setOnCreateContextMenuListener的監聽,但這樣做只能使這個listView中的所有項在長按的時候彈出contextMenu 。
有時希望的是有些長按時能彈出contextMenu,有些不能。解決這個問題的辦法是為這個listView設置setOnItemLongClickListener監聽,然后實現
如果這一項的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下面是肯定不會有分割線了。
解決 Android 中使用ListView和CheckBox批量操作時若干問題
關于ListView中加入并選取checkbox錯位的問題
ListView之setEmptyView的問題
關于ListView中使用GestureDetector沖突的解決辦法
?????? 今天遇到一個問題,在ListView的時候,要在首部加一個輪播圖組件,調用的是ListView的addHeaderView(View v, Object data, boolean isSelectable)方法,這個方法可以把一個view放置到Listview的頂部顯示,也可以多次調用,使得多個view按照添加的順序,依次排列在ListView的頂部顯示。
???????
??????? 這樣做了之后是顯示是沒問題的,但是遇到一個問題就是在ListView的Adapter的構造方法中,要添加ListView的條目點擊事件:mListView.setOnItemClickListener(this);
??????? 然后在Adapter里面實現onItemClick(AdapterView<?> parent, View view, int position,long id)方法,在通過position取數據的時候發現一個問題,就是點擊的條目錯位了,點擊一個條目,結果響應事件變成了下一個條目對應的事件。
??????? 經過探查之后發現,本來ListView條目的position是從0開始計算的:0,1,2...這樣,但是添加了一個Header之后,position變成了從1開始,于是需要手動修正一下這個postion的值。
??????? 好在Android中有提供一個對應的API來得到HeaderView的數量,那就是ListView中的一個方法:getHeaderViewsCount(),這個方法可以得到這個ListView添加了多少個HeaderView,然后我們需要做的只是在使用position之前,修正一下:
// TODO 修正有Header的ListView的position的BUG int headerViewsCount = listView.getHeaderViewsCount();//得到header的總數量 //得到新的修正后的position int newPosition = position - headerViewsCount;
FloatingActionButton
一個類似Android版Google+浮動功能按鈕的控件,可以響應ListView的滾動事件。當列表向上滾動的時候會自動顯示,向下滾動的時候自動隱藏。
項目地址: https://github.com/makovkastar/FloatingActionButton
Android實現自適應正方形GridView
http://blog.chengyunfeng.com/?p=465
Read more: http://blog.chengyunfeng.com/?p=465#ixzz3REioavcX
關于addHeaderView,addFooterView的問題
當listview需要添加headerview時,可以通過調用listview的addHeaderView(headView, null, false) 方法,該方法還有一個重載方法 addHeaderView(headView);這兩個方法的區別是前一個方法可以控制header是否可以被selected,如果不想被selected則將第三個參數設置成false;
addHeaderView方法必須放在listview.setadapter前面,意思很明確就是如果想給listview添加頭部則必須在給其綁定adapter前添加,否則會報錯。原因是當我們在調用setAdapter方法時會android會判斷當前listview是否已經添加header,如果已經添加則會生成一個新的tempadapter,這個新的tempadapter包含我們設置的adapter所有內容以及listview的header和footer。所以當我們在給listview添加了header后在程序中調用listview.getadapter時返回的是tempadapter而不是我們通過setadapter傳進去的adapter。如果沒有設置adapter則tempadapter與我們自己的adapter是一樣的。listview.getadapter().getcount()方法返回值會比我們預期的要大,原因是添加了header。
接著上面的tempadapter說,我們自定義adapter里面的getitem方法里面返回的position是不包括header的,是我們自定義adapter中數據position編號從0開始,也就是說與我們傳進去的list的位置是一樣的。
@Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Log.i("adapter", "position:"+position); //這個position就是我們數據的真實位置 }
但是在ListView的onItemClick方法中:
public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3)?
position是當前click的位置,這個位置是指在tempadapter中的位置,從0開始如果ListView中添加了header則0代表header。所以如果要得到ListView的第一條數據,就必須position-1
ListView的Item中含有Button時無法響應onItemClick()?
解決辦法就是將Button的Focus設置為非默認獲取
方法一:將ListView的Item Layout的子控件focusable屬性設置為false
方法二(推薦):對Item Layout的根控件android:descendantFocusability="blocksDescendant" ,對應的方法為:setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);??
方法三:在實現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),如果滿足條件則加載不同的背景。
偽代碼:
private int oldPosition = 0;//記錄上一次點擊的position gridView.setOnItemClickListener(new GridView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // TODO Auto-generated method stub ((TextView) v).setTextColor(App.res.getColor(R.color.text_color_c6));//當前點擊的這個 ((TextView) parent.getChildAt(oldPosition)).setTextColor(App.res.getColor(R.color.text_color_c2));//上一次點擊的那個 oldPosition = position;//重新賦值 } });
gridView.setAdapter(new CommonAdapter<Unit>(context, instance.getUnits(), R.layout.item_for_food_detail_unit) { @Override public void setValues(ViewHolder helper, Unit item, int position) { helper.setText(R.id.item_0, item.getName()); //判斷顯示哪個顏色 ((TextView) helper.getView(R.id.item_0)).setTextColor(App.res.getColor(position == oldPosition ? R.color.text_color_c6 : R.color.text_color_c2)); } });
或者:
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//api 11 ? getListView().setItemChecked(position, true);//api 11 ?
或者:
http://www.eoeandroid.com/thread-535829-1-1.html
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"http://從下開始顯示條目
??????? 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"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/transparent"/> <corners android:radius="0dip" /> </shape> //listview.setSelector(R.drawable.thisShape);
或者直接:gridView.setSelector(android.R.color.transparent);
或者還有一種辦法:
在Adapter中重寫public boolean isEnabled(int position)方法,將其返回false就可以了,推薦采用此種辦法,但是這樣的話item不響應點擊事件了,具體見 http://gundumw100.iteye.com/admin/blogs/850654
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下面是肯定不會有分割線了。
解決 Android 中使用ListView和CheckBox批量操作時若干問題
關于ListView中加入并選取checkbox錯位的問題
ListView之setEmptyView的問題
關于ListView中使用GestureDetector沖突的解決辦法
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
