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

        项目即将快完工了,还有两个关键的部分,心情还是很激动的,经过两个月的从零开始,学到的都已经记录在博客里了,主要涉及的是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(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 implements
			OnItemSelectedListener {

		@Override
		public 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;
		}

		@Override
		public 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<?> parent) {
            }
        }) ;
    }







     

你可能感兴趣的:(Android)