android pickerview 多行,Android PickerView 自定义条件选择器 联动

先说需求:要求点开的时候是如图1所示;当第一列滚动到24岁时,第二列从24开始显示,符合选择逻辑。

145a928542f4

图1

145a928542f4

图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集合结构如下。

145a928542f4

list数据

重点来了,第二个mOptionsAgeItems集合的结构如下。

145a928542f4

mOptionsAgeItems第一级数据

这里可以看到mOptionsAgeItems集合也同样必须是84个子集合(这里的数据数量必须与list的数量一致,否则会报错),每个子集合里又包含了第二个选择器要显示的数据。举个例子,如果我list里面选择19,也就是list的第三个数据。那么此时,第二个选择器的第三条数据最小要从19开始,我们看一下结构。

145a928542f4

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 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 sencondAgeList = new ArrayList<>();

//以下作用就是构建第二级数据的原理,非常简单

if(k>0){

listTemp.remove(0);

}

for(String str:listTemp){

sencondAgeList.add(str);

}

mOptionsAgeItems.add(sencondAgeList);

}

以上,ageList对应mPickerView.setPicker(list, mOptionsAgeItems)里面的list.

我的处理办法有点蠢,冥冥中感觉有更好的解决方案,但是时间原因也没有深究。希望相互讨论学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值