美文网首页Android自定义控件Android UIAndroid开发经验谈
Android PickerView 自定义条件选择器 联动

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

作者: Maybe_G | 来源:发表于2018-05-12 09:00 被阅读146次

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

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

    相关文章

      网友评论

        本文标题:Android PickerView 自定义条件选择器 联动

        本文链接:https://www.haomeiwen.com/subject/fhrcdftx.html