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<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.

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,145评论 25 707
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,618评论 1 180
  • 生活需要诗意 文 / 老槐 编辑/ 老槐 许久未见雪,贴一篇2015年在北京时写的文章 在诗人描写世间景象的诗句里...
    老槐走天涯阅读 1,231评论 0 0
  • 爱情是个奇怪的东西。坚若磐石,又脆若朝露。她可以跨越时空,挑战岁月,无惧风霜雨雪,也可以转瞬间浓情化为乌有,爱侣变...
    烟行阅读 380评论 0 1
  • 《思念》 文/雅心 一个人的时候 开心就笑 一个人的时候 难过就哭 一个人的时候 谁是你的依靠 谁又是你的未...
    心静688阅读 203评论 4 5