<ListView android:id="@+id/locallist_lv" android:layout_width="fill_parent"android:layout_height="fill_parent" android:layout_above="@id/btm_menu" android:layout_below="@id/top_menu" android:divider="@drawable/song_item_line" item之間的分割線android:cacheColorHint="#00000000"系統切換item時的緩衝色android:scrollbars="none"不顯示捲軸 android:listSelector="#00000000"/>選中時背景色
ListView遇到的兩個問題 List集合的排序
1. 將ListView的背景色設定為白色,ListIView控制項上下滑動時,背景就會變為黑色,但是圖片會正常顯示,這怎麼解決呢?網上搜了一下,
如果大家在非黑色背景下使用ListView控制項時,Android預設可能在滾動ListView時這個清單控制項的背景突然變成黑色。這樣可能導致程式的黑色的背景和主程式的主題既不協調。解決的方法Google在設計Android時也考慮了,在Layout的ListView中加入 android:cacheColorHint="#00000000" 的屬性即可,或者是調用ListView的setCacheColorHint(0);方法。
2. 在ListView的item項裡使用CheckBox或者Button時,OnItemClickListener無響應的問題
在Android軟體設計與實現中我們通常都會使用到ListView這個控制項,系統有一些預置的Adapter可以使用,例如SimpleAdapter和ArrayAdapter,但是總是會有一些情況我們需要通過自訂ListView來實現一些效果,那麼在這個時候,我們通常會碰到自訂ListView無法選中整個ListViewItem的情況,也就是無法響應ListView的onItemClickListener中的onItemClick()方法,之後自己查看了一下ViewGroup的源碼,發現了以下的一段常量聲明:
/**
* This view will get focus before any of its descendants.
*/
public static final int FOCUS_BEFORE_DESCENDANTS = 0×20000;
/**
* This view will get focus only if none of its descendants want it.
*/
public static final int FOCUS_AFTER_DESCENDANTS = 0×40000;
/**
* This view will block any of its descendants from getting focus, even
* if they are focusable.
*/
public static final int FOCUS_BLOCK_DESCENDANTS = 0×60000;
/** * This view will get focus before any of its descendants. */
public static final int FOCUS_BEFORE_DESCENDANTS = 0×20000;
/** * This view will get focus only if none of its descendants want it. */
public static final int FOCUS_AFTER_DESCENDANTS = 0×40000;
/** * This view will block any of its descendants from getting focus, even * if they are focusable. */
public static final int FOCUS_BLOCK_DESCENDANTS = 0×60000;
我們看到了一行代碼定義的變數的意思是“當前View將屏蔽他所有子控制項的Focus狀態,即便這些子控制項是可以Focus的”,其實這段話的意思就是這個變數代表著當前的View將不顧其子控制項是否可以Focus自身接管了所有的Focus,通常預設能獲得focus的控制項有Button,Checkable繼承來的所有控制項,這就意味著如果你的自訂ListViewItem中有Button或者Checkable的子類控制項的話,那麼預設focus是交給了子控制項,而ListView的Item能被選中的基礎是它能擷取Focus,也就是說我們可以通過將ListView中Item中包含的所有控制項的focusable屬性設定為false,這樣的話ListView的Item自動獲得了Focus的許可權,也就可以被選中了,也就會響應onItemClickListener中的onItemClick()方法,然而將ListView的Item Layout的子控制項focusable屬性設定為false有點繁瑣,我們可以通過對Item Layout的根控制項設定其android:descendantFocusability=”blocksDescendants”即可,這樣Item Layout就屏蔽了所有子控制項擷取Focus的許可權,不需要針對Item Layout中的每一個控制項重新設定focusable屬性了,如此就可以順利的響應onItemClickListener中的onItenClick()方法了。例如我的ListViw的每個item項是RelativeLayout,那麼我就可以設定RelativeLayout的android:descendantFocusability=”blocksDescendants”即可。注意:這個屬性不能設定給ListView,設定了也不起作用。
第二種方法是將ListView子控制項中的CheckBox或者ImageButton,Button的android:focusable="false"屬性即可。
第三種方法是不適用CheckBox,或者Button,使用TextView,等等完全可以代替Button。