首先說下項目要求:
??? 制作一個設(shè)備列表,gridview 形式同蜻,數(shù)據(jù)源是JSONARRAY棚点,效果圖差不多如下所示,主要功能就是展示設(shè)備湾蔓,當(dāng)點擊一個設(shè)備的時候瘫析,彈出下拉列表,顯示設(shè)備的所有型號。
??? 看到這個效果圖的時候贬循,首先想到的是用Spinner吧咸包,如果你想到的是PopupWindow,那證明你能力比我強杖虾,可以return了烂瘫,想繼續(xù)了解一下spinner那些坑的,可以continue~
??? 下面就是簡單總結(jié)的要注意的事項奇适。
Spinner
1) spinner 的下拉三角號的顯示與不顯示:? spinner 的 background 設(shè)置為 "@null" 時坟比,spinner 的三角號就可以消失了,默認(rèn)有三角號
2) spinner 的 onItemSelected() 方法嚷往,每次進(jìn)入 activity 的時候會調(diào)用 (有幾個spinner葛账,就會調(diào)用幾次),onPause() 之后皮仁,onItemSelected() 方法會調(diào)用一次(無論有幾個spinner籍琳,都只會調(diào)用一次)。
初始化的調(diào)用魂贬,可通過 spinner.setSelection(0,false); 屏蔽巩割。
onPause() 之后的調(diào)用裙顽,可通過設(shè)置標(biāo)志位屏蔽付燥,在onPause() 和 onResume() 中,設(shè)置flag愈犹,在onItemSelected() 方法中判斷flag键科,及時return。
3) 當(dāng)點擊同一 item 時漩怎,不會回調(diào) onItemSelected() 方法勋颖, 通過在 onTouch() 方法中,通過反射機制勋锤,將上次選中的 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 和 一個 boolean 值,看源碼似乎單參的是設(shè)定下一個選中項谈宛,而雙參是直接回調(diào)onItemSelected()次哈,反正剛開始寫的時候,怎么寫怎么不對吆录,后來寫對了之后窑滞,怎么寫怎么對。。哀卫。鬼知道為什么
反正巨坊,對于同一選項無法調(diào)用,就用反射聊训,想屏蔽初始化抱究,就用setSelection() 就對了
5)最后一個折磨我的問題,就是spinner下拉選項的字體不居中4摺鼓寺!馬丹,鬼知道我改了什么導(dǎo)致的勋磕,item_dropdown 布局文件中的 textview 的 gravity 明明已經(jīng)設(shè)置成 center 了妈候,但文字就是不居中,垂直方向居中還能辦到挂滓,水平方向就是靠在左邊苦银, Oh 我的天哪, 找了N久(兩個小時赶站? maybe)幔虏,終于找到原因了,我把原來的 textAlignment="center" 刪掉了贝椿,鬼知道我什么時候刪的想括,鬼知道這么重要,這個參數(shù)在 API 17 以后才啟用的烙博,該參數(shù)適用于所有的 View 及其子類瑟蜈, 而 gravity 只適用于 TextView 及其子類,而且渣窜, textAlignment 參數(shù)只能設(shè)定左右是否居中铺根,上下無能。
具體代碼不貼乔宿,貼了也無法人人可用位迂,因為數(shù)據(jù)源不一樣,至于以后會不會整合好成一個demo详瑞,看心情掂林。that's all.