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