美文网首页
Spinner 的那些坑

Spinner 的那些坑

作者: 没有梦想的小透明 | 来源:发表于2016-12-17 12:49 被阅读556次

    首先说下项目要求:

        制作一个设备列表,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.

    相关文章

      网友评论

          本文标题:Spinner 的那些坑

          本文链接:https://www.haomeiwen.com/subject/iodrmttx.html