先说需求:要求点开的时候是如图1所示;当第一列滚动到24岁时,第二列从24开始显示,符合选择逻辑。
图1图2
这里主要涉及到PickerView 数据的构建,具体PickerView的用法请参照其他文章。
1.明确构建目标
mPickerView = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
//这里写显示逻辑
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
}).setTitleBgColor(0xffedbd5a)//标题背景颜色 Night mode
.setSubmitColor(R.color.black)
.setCancelColor(R.color.black)//取消按钮文字颜色
.build();
mPickerView.setPicker(list, mOptionsAgeItems);
mPickerView.show();
因为我的显示写的比较多,所以在此省略。我们主要构建的数据是mPickerView.setPicker(list, mOptionsAgeItems);
里面的list以及mOptionsAgeItems。
2.明确数据结构
我们需要显示的年龄段是从18岁到100岁之间,那么第一个list集合结构如下。
list数据
重点来了,第二个mOptionsAgeItems集合的结构如下。
mOptionsAgeItems第一级数据这里可以看到mOptionsAgeItems集合也同样必须是84个子集合(这里的数据数量必须与list的数量一致,否则会报错),每个子集合里又包含了第二个选择器要显示的数据。举个例子,如果我list里面选择19,也就是list的第三个数据。那么此时,第二个选择器的第三条数据最小要从19开始,我们看一下结构。
mOptionsAgeItems第二级数据需要说明的是,如果是三级数据,比如说省市区联动,第三个选择器里面的数据就是三层嵌套,具体可以看PickView里面省市区的Demo。
明确了这一点,那么我们下面就开始构建数据吧。
3.构建处理数据
talk is cheap,show me the code.
String[] ages = new String[84];
ages[0] = "不限";
for (int i = 1; i <= 83; i++) {
ages[i] = 17 + i + "岁";
}
//利用Arrays.asList转化为集合,注意该方法转化的集合不能够记性add或remove等操作
ageList = Arrays.asList(ages);
mOptionsAgeItems = new ArrayList<>();
//由于需要将ageList作为第一个参数list传入,
// 所以需要一个临时list把ageList的数据存起来转入第二个参数中
List<String> listTemp = new ArrayList<>();
listTemp.clear();
for (int j = 0; j < ageList.size(); j++) {
//将ageList中的数据全部拷贝一份到listTemp里面
listTemp.add(ageList.get(j));
}
for (int k = 0; k < 84; k++) {
//注意:这里必须要在for循环里面new,
//否则mOptionsAgeItems集合里面每个子集合都是一样的
//这里涉及到引用对象地址的唯一性问题,String也是引用对象
List<String> sencondAgeList = new ArrayList<>();
//以下作用就是构建第二级数据的原理,非常简单
if(k>0){
listTemp.remove(0);
}
for(String str:listTemp){
sencondAgeList.add(str);
}
mOptionsAgeItems.add(sencondAgeList);
}
代码里面写的注释很详细,就不赘述了。
关于引用对象地址唯一性的问题看一篇文章
https://www.cnblogs.com/gongheng/p/5766764.html
以上,ageList对应mPickerView.setPicker(list, mOptionsAgeItems)
里面的list.
我的处理办法有点蠢,冥冥中感觉有更好的解决方案,但是时间原因也没有深究。希望相互讨论学习。
网友评论