首先說(shuō)下項(xiàng)目要求:
??? 制作一個(gè)設(shè)備列表,gridview 形式,數(shù)據(jù)源是JSONARRAY,效果圖差不多如下所示,主要功能就是展示設(shè)備,當(dāng)點(diǎn)擊一個(gè)設(shè)備的時(shí)候,彈出下拉列表,顯示設(shè)備的所有型號(hào)。

??? 看到這個(gè)效果圖的時(shí)候,首先想到的是用Spinner吧,如果你想到的是PopupWindow,那證明你能力比我強(qiáng),可以return了,想繼續(xù)了解一下spinner那些坑的,可以continue~
??? 下面就是簡(jiǎn)單總結(jié)的要注意的事項(xiàng)。
Spinner
1) spinner 的下拉三角號(hào)的顯示與不顯示:? spinner 的 background 設(shè)置為 "@null" 時(shí),spinner 的三角號(hào)就可以消失了,默認(rèn)有三角號(hào)
2) spinner 的 onItemSelected() 方法,每次進(jìn)入 activity 的時(shí)候會(huì)調(diào)用 (有幾個(gè)spinner,就會(huì)調(diào)用幾次),onPause() 之后,onItemSelected() 方法會(huì)調(diào)用一次(無(wú)論有幾個(gè)spinner,都只會(huì)調(diào)用一次)。
初始化的調(diào)用,可通過(guò) spinner.setSelection(0,false); 屏蔽。
onPause() 之后的調(diào)用,可通過(guò)設(shè)置標(biāo)志位屏蔽,在onPause() 和 onResume() 中,設(shè)置flag,在onItemSelected() 方法中判斷flag,及時(shí)return。
3) 當(dāng)點(diǎn)擊同一 item 時(shí),不會(huì)回調(diào) onItemSelected() 方法, 通過(guò)在 onTouch() 方法中,通過(guò)反射機(jī)制,將上次選中的 id 設(shè)置為默認(rèn)值。
try{
Class clazz = AdapterView.class;
Field field = clazz.getDeclaredField("mOldSelectedRowId");
field.setAccessible(true);
field.setInt(spinner, Integer.MIN_VALUE);
}catch(Exception e) {
e.printStackTrace();
}
4) spinner.setSelection() 有兩種調(diào)用方式,單參和雙參,單參只傳顯示的 Position , 雙參的傳 position 和 一個(gè) boolean 值,看源碼似乎單參的是設(shè)定下一個(gè)選中項(xiàng),而雙參是直接回調(diào)onItemSelected(),反正剛開始寫的時(shí)候,怎么寫怎么不對(duì),后來(lái)寫對(duì)了之后,怎么寫怎么對(duì)。。。鬼知道為什么
反正,對(duì)于同一選項(xiàng)無(wú)法調(diào)用,就用反射,想屏蔽初始化,就用setSelection() 就對(duì)了
5)最后一個(gè)折磨我的問(wèn)題,就是spinner下拉選項(xiàng)的字體不居中?。●R丹,鬼知道我改了什么導(dǎo)致的,item_dropdown 布局文件中的 textview 的 gravity 明明已經(jīng)設(shè)置成 center 了,但文字就是不居中,垂直方向居中還能辦到,水平方向就是靠在左邊, Oh 我的天哪, 找了N久(兩個(gè)小時(shí)? maybe),終于找到原因了,我把原來(lái)的 textAlignment="center" 刪掉了,鬼知道我什么時(shí)候刪的,鬼知道這么重要,這個(gè)參數(shù)在 API 17 以后才啟用的,該參數(shù)適用于所有的 View 及其子類, 而 gravity 只適用于 TextView 及其子類,而且, textAlignment 參數(shù)只能設(shè)定左右是否居中,上下無(wú)能。
具體代碼不貼,貼了也無(wú)法人人可用,因?yàn)閿?shù)據(jù)源不一樣,至于以后會(huì)不會(huì)整合好成一個(gè)demo,看心情。that's all.