首先说下项目要求:
制作一个设备列表,gridview 形式,数据源是JSONARRAY,效果图差不多如下所示,主要功能就是展示设备,当点击一个设备的时候,弹出下拉列表,显示设备的所有型号。
设备列表看到这个效果图的时候,首先想到的是用Spinner吧,如果你想到的是PopupWindow,那证明你能力比我强,可以return了,想继续了解一下spinner那些坑的,可以continue~
下面就是简单总结的要注意的事项。
Spinner
1) spinner 的下拉三角号的显示与不显示: spinner 的 background 设置为 "@null" 时,spinner 的三角号就可以消失了,默认有三角号
2) spinner 的 onItemSelected() 方法,每次进入 activity 的时候会调用 (有几个spinner,就会调用几次),onPause() 之后,onItemSelected() 方法会调用一次(无论有几个spinner,都只会调用一次)。
初始化的调用,可通过 spinner.setSelection(0,false); 屏蔽。
onPause() 之后的调用,可通过设置标志位屏蔽,在onPause() 和 onResume() 中,设置flag,在onItemSelected() 方法中判断flag,及时return。
3) 当点击同一 item 时,不会回调 onItemSelected() 方法, 通过在 onTouch() 方法中,通过反射机制,将上次选中的 id 设置为默认值。
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() 有两种调用方式,单参和双参,单参只传显示的 Position , 双参的传 position 和 一个 boolean 值,看源码似乎单参的是设定下一个选中项,而双参是直接回调onItemSelected(),反正刚开始写的时候,怎么写怎么不对,后来写对了之后,怎么写怎么对。。。鬼知道为什么
反正,对于同一选项无法调用,就用反射,想屏蔽初始化,就用setSelection() 就对了
5)最后一个折磨我的问题,就是spinner下拉选项的字体不居中!!马丹,鬼知道我改了什么导致的,item_dropdown 布局文件中的 textview 的 gravity 明明已经设置成 center 了,但文字就是不居中,垂直方向居中还能办到,水平方向就是靠在左边, Oh 我的天哪, 找了N久(两个小时? maybe),终于找到原因了,我把原来的 textAlignment="center" 删掉了,鬼知道我什么时候删的,鬼知道这么重要,这个参数在 API 17 以后才启用的,该参数适用于所有的 View 及其子类, 而 gravity 只适用于 TextView 及其子类,而且, textAlignment 参数只能设定左右是否居中,上下无能。
具体代码不贴,贴了也无法人人可用,因为数据源不一样,至于以后会不会整合好成一个demo,看心情。that's all.
网友评论