Android PickerView 自定义条件选择器 联动

先说需求:要求点开的时候是如图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 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);
        }

代码里面写的注释很详细,就不赘述了。
关于引用对象地址唯一性的问题看一篇文章
https://www.cnblogs.com/gongheng/p/5766764.html

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

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

你可能感兴趣的:(Android PickerView 自定义条件选择器 联动)