Android Spinner控件 显示数据和下拉选中数据分离

来源:互联网 发布:直销软件 编辑:程序博客网 时间:2024/06/05 02:49

        项目即将快完工了,还有两个关键的部分,心情还是很激动的,经过两个月的从零开始,学到的都已经记录在博客里了,主要涉及的是fragment还有一些乱码解决、 适配器的实际的解决方案,博客地址为:http://blog.csdn.net/nihaoqiulinhe。

     上个礼拜一直纠结于一个问题就是:下拉的spinner数据,点击之后如何能动态的修改显示的数据。需求具体是这样的:有一个有效期限,有以下几种:1小时、2小时、4小时、8小时等,当用户点击下拉列表1小时之后,显示的是当前时间加上1小时的时间。

   解决方案如下:

       spinner都有监听方法,当点击了某一个下拉列表项之后,就会识别当前的位置、以及显示框的view,这时候只需要得到下拉的是哪个选项,然后给view重新设置数据,使用switch语句来区分点击的是哪个,就可以动态的修改填充数据,代码如下:

      

// **********第2个下拉列表,有效日期************spinner = (Spinner) view.findViewById(R.id.effectivedate);// 将可选内容与ArrayAdapter连接起来adapter = new ArrayAdapter<String>(getActivity(),R.layout.activity_tipsprice_spinner, m);// //设置下拉列表的风格adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 将adapter 添加到spinner中spinner.setAdapter(adapter);// 添加事件Spinner事件监听spinner.setOnItemSelectedListener(new effectivedateSpinnerSelectedListener());spinner.setSelection(0, false);// 设置默认值spinner.setVisibility(View.VISIBLE);}// 使用数组形式操作class effectivedateSpinnerSelectedListener implementsOnItemSelectedListener {@Overridepublic void onItemSelected(AdapterView<?> arg0, =View arg1=,//这两个分别代表着显示的spinner,选择的位置long arg3) {switch (arg2) {case 0:if (flagOne == 0) {//这里标志位是为了实现,第一次进入的时候默认显示为1小时break;} else {String oneHour = chooseDate(1);((TextView) arg1).setText(oneHour);flagOne = 1;break;}case 1:String twoHour = chooseDate(2);((TextView) arg1).setText(twoHour);break;case 2:String fourHour = chooseDate(4);((TextView) arg1).setText(fourHour);break;case 3:String eightHour = chooseDate(8);((TextView) arg1).setText(eightHour);break;case 4:String twelveHour = chooseDate(12);((TextView) arg1).setText(twelveHour);break;case 5:String SixTeeHour = chooseDate(16);((TextView) arg1).setText(SixTeeHour);break;default:break;}Toast tst = Toast.makeText(getView().getContext(), "您点击了" + m[arg2]+ "第" + arg2 + "项", Toast.LENGTH_SHORT);tst.show();}private String chooseDate(int hours) {//对时间进行增加SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar ca = Calendar.getInstance();ca.setTime(new Date());ca.add(Calendar.HOUR_OF_DAY, hours);String str = sdf.format(ca.getTime());return str;}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {}}
       这样的问题,我在网上搜了很多次,都没有人给出很清晰的解答,所以就斗胆记录下来,这种方式可以很好的解决选择与显示分离的功能,有更好的办法的前辈,不吝赐教。关于spinner的基础的具体用法,可以参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0105/2264.html这篇博文。

我总结一下,这个监听函数,提供的几个参数是解决这个问题的关键,初始的时候下拉列表的数据都是静态的,选择某个数据之后,利用位置和view来进行动态的修改,完成目标。

     

        还有另外需求,如果spinner刚开始进去的时候不显示任何数据,下面是另一位前辈提供的方案,其实原理跟我上面差不多,就是利用view。

转自:http://het.im/post/android-spinner-no-select-default.html


android Spinner默认不选中项目开发中经常有些变态的需求,比如要求spinner默认不选中任何一项。

如果你自定义spinner,那这个当然不是问题;也可以在原有的选项列表中开头增加一项空字符串项,默认显示这个空字符串也达到了效果,不过采用这种方式需要你在获取被选择项的位置时忽略空字符串项。

经过一番摸索,发现我们只要保证 spinner第一次展示时不显示即可,相关代码如下:

boolean isSpinnerFirst = true ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main) ;        Spinner spinner = (Spinner)findViewById(R.id.spinner) ;        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {            @Override            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {                if (isSpinnerFirst) {                    //第一次初始化spinner时,不显示默认被选择的第一项即可                    view.setVisibility(View.INVISIBLE) ;                }                isSpinnerFirst = false ;            }            @Override            public void onNothingSelected(AdapterView&lt;?&gt; parent) {            }        }) ;    }







     

0 0