Android仿Boss直聘文本日期混合滚轮选择器示例

1、需求分析

GitHub上面有一款iOS风格的滚轮选择器Android-PickerView,它分为时间选择器代码TimePickerView和选项选择器OptionsPickerView,不但可以选择时间日期,可以选择我们自定义的数据,比如性别、年龄等。我一直都用它。直到最近遇到了一个需求,它的选项里面既有文字也有时间,大体效果如Boss直聘添加项目经验中的时间选择功能:

从图中我们可以看出,除了常规的年份和月份的选择,选项中还包含了文本。其中,最新的时间是“至今”,而最早可供选择的时间则是“1900以前”。所以看起来似乎TimePickerViewOptionsPickerView都无法实现这个功能。我们都沮丧地认为这下要么得自定义控件,要么得修改Android-PickerView这个库了。但我转念一想,为什么要把“时间选择”和“选项选择”分得那么开呢?时间选择其实也是选项选择的一种嘛。比如我要选择2017年12月,那就是从年份中选择2017,从月份中选择12。只要设置好一级选项和二级选项就可以了。

2、选项结构分析

有了思路之后,我们来分析一下选项的数据结构。年份可以分为3种情况:

  1. 最新年份,其实也是最新的时间:“至今”;
  2. 常规的年份:1990~当前年份(2018);
  3. 最早的年份,也就是最早的时间:“1990以前”。

我在Boss直聘的基础上加了一些限制:当前年份下对应的可供选择的月份范围只能是从月到当前月份,比如现在是2018年2月,那么选好年份为2018后,月份就只能选择1和2。这样一来,月份就有四种情况了:

  1. 最新月份:“至今”;
  2. 当前年份下对应的月份范围:1~当前月份;
  3. 完整的月份,即1~12;
  4. 最早月份:“1990以前”。

可以总结为如下的表格:

年份 月份
最新年份“至今” 最新年份“至今”
当前年份 1~当前月份
1990~当前年份-1 月份1~12
最早年份“1990以前” 最早月份“1990以前”

3、书写代码

在开始写代码之前,我建议你先去GitHub上看看Android-PickerView的使用用法,它使用了构造者模式,用起来很简单。

现在,就开始写我们的代码了。

3.1 界面布局

布局就是一个按钮,点击后弹出滚轮选择器,选好后点击确认即将数据在TextView上显示出来。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
    android:textAllCaps="false"
    android:text="显示PickerView"
    android:onClick="showPickerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

  <TextView
    android:id="@+id/tv_time"
    android:textSize="16sp"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

3.2 Activity代码

借助强大的PickerView,我们实现起来很简单,请看如下的代码:

public class MultipleOptionActivity extends AppCompatActivity {

  private TextView tvTime;

  /**
   * 完整的月份数据1~12
   */
  private List<String> monthList = new ArrayList<>();
  /**
   * 滚轮选择器中年份的选项数据
   */
  private List<String> optionYears = new ArrayList<>();
  /**
   * 滚轮选择器中月份的选项数据
   */
  private List<List<String>> optionMonths = new ArrayList<>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_multiple_option);
    tvTime = (TextView) findViewById(R.id.tv_time);
    initData();
  }

  /**
   * 初始化数据
   */
  private void initData() {
    //设置完整的月份数据,即1~12
    for (int i = 1; i <= 12; i++) {
      monthList.add(String.valueOf(i));
    }
    Calendar calendar = Calendar.getInstance();
    int curYear = calendar.get(Calendar.YEAR);
    //月份获取到的数据是0~11,所以要加1
    int curMonth = calendar.get(Calendar.MONTH) + 1;
    for (int i = curYear + 1; i >= 1989; i--) {
      //对应年份的月份数据集合
      List<String> tempMonths = new ArrayList<>();
      if (i == curYear + 1) {
        //设置最新时间“至今”
        optionYears.add("至今");
        tempMonths.add("至今");
        optionMonths.add(tempMonths);
      } else if (i == curYear) {
        //设置当前年份及其对应的月份
        optionYears.add(String.valueOf(i));
        for (int j = 1; j <= curMonth; j++) {
          tempMonths.add(String.valueOf(j));
        }
        optionMonths.add(tempMonths);
      } else if (i == 1989) {
        //设置最早时间“1900以前”
        optionYears.add("1990以前");
        tempMonths.add("1990以前");
        optionMonths.add(tempMonths);
      } else {
        //设置常规时间
        optionYears.add(String.valueOf(i));
        optionMonths.add(monthList);
      }
    }
  }
  /**
   * 显示滚轮
   *
   * @param view
   */
  public void showPickerView(View view) {
    OptionsPickerView multipleOp = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
      @Override
      public void onOptionsSelect(int options1, int options2, int options3, View v) {
        if (options1 == 0 || options1 == optionYears.size() - 1) {
          //选中最新和最早时间时直接显示文字,不需要拼接月份
          tvTime.setText(optionYears.get(options1));
        } else {
          //常规的时间,需要拼接年份和月份
          tvTime.setText(new StringBuffer(optionYears.get(options1)).append("—").append(monthList.get(options2)));
        }
      }
    }).setTitleText("请选择时间")
        .build();
    multipleOp.setPicker(optionYears, optionMonths);
    multipleOp.show();
  }
}

代码很少,注释我也写得很清楚了,相信大家很容易理解。我们重点关注OptionsPickerViewsetPicker方法,它可以传入三个参数,每个参数都是集合,但每个参数的类型都不同。第一个参数是List,第二个参数是List<List>,第三个参数是List<List<list>>。看到这里你就明白了,我们每个年份对应的月份数据就是一个集合(当然,集合大小不相同),比如年份2017,对应的月份就是有着12个元素的集合。理清楚这一点之后,也就理解initData方法里面对数据的设置了。

最后在TextView中显示数据时自然也要分类了,对于“至今”和“1990以前”我们至今显示文本,其他的再拼接一下,看起来像是时间就行了。

看看我们最后实现的效果图:

4、总结

在项目中使用一些好的第三方库是可以大大节省我们的开发时间的,但是在使用过程中也要灵活一点。比如我们在一个页面中需要多次用到滚轮选择器(比如选择开始时间和结束时间),那么每次都要设置一遍滚轮的样式和写一次点击事件也太麻烦了。这时,我们就可以将滚轮样式的设置代码抽取出来:

  /**
  * 设置滚轮样式
  * @return
  */
  private OptionsPickerView.Builder createBuilder(){
    OptionsPickerView.Builder builder = new OptionsPickerView.Builder(MultipleOptionActivity.this,this)
        .setBgColor(ContextCompat.getColor(this,R.color.colorAccent))
        .setSubmitText("确定")
        .setCancelText("取消");
    //下面可以继续设置样式
    return builder;
  }

然后显示滚轮的时候只要这样写:

OptionsPickerView op = createBuilder().build();
op.setPicker(数据1,数据2);
op.show();

点击事件也可以封装起来,让我们的Activity继承OptionsPickerView.OnOptionsSelectListener,然后实现点击事件:

  /**
   * 滚轮的监听事件
   * @param options1
   * @param options2
   * @param options3
   * @param v
   */
  @Override
  public void onOptionsSelect(int options1, int options2, int options3, View v) {
    switch (v.getId()){
      //根据所点击的控件Id来区分点击事件
      case R.id.btn_show:
        break;
      default:
        break;
    }
  }

那么OptionsPickerView怎么获取到点击View的id的呢?我们在调用show方法的时候传入点击View的对象就可以了。以上是我个人的一点心得,希望对大家有所帮助。

最后给一下源码吧:源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android selector背景选择器的使用详解
  • Android时间选择器、日期选择器实现代码
  • 浅谈谈Android 图片选择器
  • android 字体颜色选择器(ColorPicker)介绍
  • Android自定义可循环的滚动选择器CycleWheelView
  • Android仿微信照片选择器实现预览查看图片
  • 基于android背景选择器selector的用法汇总
  • Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)
(0)

相关推荐

  • 基于android背景选择器selector的用法汇总

    一.创建xml文件,位置:drawable/xxx.xml,同目录下记得要放相关图片 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <!-- 没有焦点时的背景图片 -->    <item android:dr

  • Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

    本文Github代码链接 https://github.com/AndroidMsky/AndoirdIOSPicker 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDialog(List<Integer> date) { DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this); bui

  • Android selector背景选择器的使用详解

    在开发应用中,很多情况下要设计listview或button控件的背景,下面总结一下android的selector的用法:1.在drawable中配置Android的selector.将如下的XML文件保存成你自己命名的.xml文件(比如item_bg.xml),并将该文件放置在drawable文件中,在系统使用时根据ListView中的列表项的状态来使用相应的背景图片. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8&q

  • android 字体颜色选择器(ColorPicker)介绍

    primary_text_yellow.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this f

  • Android自定义可循环的滚动选择器CycleWheelView

    最近碰到个项目要使用到滚动选择器,原生的NumberPicker可定制性太差,不大符合UI要求. 网上开源的WheelView是用ScrollView写的,不能循环滚动,而且当数据量很大时要加载的Item太多,性能非常低. 然后,还是自己写一个比较靠谱,用的是ListView实现的.写完自己体验了一下,性能不错,再大的数据也不怕了. 感觉不错,重新封装了一下,提供了一些接口可以直接按照自己的需求定制,调用方法在MainActivity中. 补个图片: 不多说了,直接上代码: CycleWheel

  • 浅谈谈Android 图片选择器

    ImageSelector 简介 Android自定义相册,实现了拍照.图片选择(单选/多选).ImageLoader无绑定 任由开发者选择 https://github.com/YancyYe/ImageSelector Demo Download Apk 更新内容 UI重改 所有功能可配置 解决OOM情况 图片手动选择 支持汉语和英语 截图展示 使用说明 步骤一: 通过Gradle抓取 dependencies { compile 'com.yancy.imageselector:image

  • Android时间选择器、日期选择器实现代码

    本文为大家分享了两款选择器,一款可以针对时间进行选择.一款可以针对日期进行选择,供大家参考,具体内容如下 一.时间选择器 1.1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.and

  • Android仿微信照片选择器实现预览查看图片

    好了下面进入正题,我们先看一下实现效果吧: 下面来介绍一下代码: 本思路就是: 1.先到手机中扫描jpeg和png的图片 2.获取导图片的路径和图片的父路径名也就是文件夹名 3.将图片路径和文件夹名分别添加导数据源中 4.数据源有了就是显示了,文件夹显示是利用的popwindow,而图片显示则是GridView 看一下具体代码: 首先开启一个线程去扫描图片 /** * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 */

  • Android仿Boss直聘文本日期混合滚轮选择器示例

    1.需求分析 GitHub上面有一款iOS风格的滚轮选择器Android-PickerView,它分为时间选择器代码TimePickerView和选项选择器OptionsPickerView,不但可以选择时间日期,可以选择我们自定义的数据,比如性别.年龄等.我一直都用它.直到最近遇到了一个需求,它的选项里面既有文字也有时间,大体效果如Boss直聘添加项目经验中的时间选择功能: 从图中我们可以看出,除了常规的年份和月份的选择,选项中还包含了文本.其中,最新的时间是"至今",而最早可供选择

  • flutter实现仿boss直聘功能

    Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能构建高性能.高保真的iOS和Android应用程序,并且在排版.图标.滚动.点击等方面实现零差异. 2年前,RN刚出来时做了个仿拉钩的demo,react-native-lagou. 这次flutter来了,想感受一下,索性用目前flutter的版本写的一个仿boss直聘应用. 时间有限,没完全仿照,去掉了一些功能,但是界面风格一致,有参考价值. github地址:flutter仿boss直聘. 感悟 与

  • Scrapy框架爬取Boss直聘网Python职位信息的源码

    分析 使用CrawlSpider结合LinkExtractor和Rule爬取网页信息 LinkExtractor用于定义链接提取规则,一般使用allow参数即可 LinkExtractor(allow=(), # 使用正则定义提取规则 deny=(), # 排除规则 allow_domains=(), # 限定域名范围 deny_domains=(), # 排除域名范围 restrict_xpaths=(), # 使用xpath定义提取队则 tags=('a', 'area'), attrs=(

  • python使用bs4爬取boss直聘静态页面

    思路: 1.将需要查询城市列表,通过城市接口转换成相应的code码 2.遍历城市.职位生成url 3.通过url获取列表页面信息,遍历列表页面信息 4.再根据列表页面信息的job_link获取详情页面信息,将需要的信息以字典data的形式存在列表datas里 5.判断列表页面是否有下一页,重复步骤3.4:同时将列表datas一直传递下去 6.一个城市.职位url爬取完后,将列表datas接在列表datas_list后面,重复3.4.5 7.最后将列表datas_list的数据,遍历写在Excel

  • Python数据分析之Python和Selenium爬取BOSS直聘岗位

    一.数据爬取的代码 #encoding='utf-8' from selenium import webdriver import time import re import pandas as pd import os def close_windows(): #如果有登录弹窗,就关闭 try: time.sleep(0.5) if dr.find_element_by_class_name("jconfirm").find_element_by_class_name("c

  • Android仿QQ长按删除弹出框功能示例

    废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

  • Android仿ios年龄、生日、性别滚轮效果

    新项目Android和ios要做成统一样式,年龄,性别,时间,要做成滚轮效果,Android没有原生控件,只能自己定义,于是我较劲脑汁,终于写出来,本着分享精神,贴出部分代码,直接拷贝就能用. 先看效果图,如果符合你的需求,再采纳 时间 年龄 性别 废话不多说,直接上代码 布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id=&q

  • Android仿淘宝切换商品列表布局效果的示例代码

    最近电商项目中有这样一个需求,就是在进入商品列表界面,有一个按钮可以切换商品列表的布局(网格或者垂直列表排列). 效果图: 上面两幅图分别是点击右上角按钮后显示两种不同布局的效果.简单的流程可以概括为:第一次进入页面,有个默认的布局(网格布局),点击按钮,由网格布局切换到竖直的线性布局,再次点击切换到网格布局. 分析: 可以看到商品展示的形式都是以列表的方式来展现,我用的是RecyclerView,这种列表并不复杂,配合Adapter数据适配器就实现了. 提出这个需求时,问了朋友,他说使用了两个

  • android仿即刻点赞文字部分的自定义View的示例代码

    概述:在学习HenCoder的过程中,有一期是模仿优秀自定义View,有一个项目是仿即刻的点赞,后来原作者在点评中提到,需要将文字和图片分开来写,并且模仿者的动画实现由点杂乱.所以决定重现实现下文字部分的效果.并拓展了更多功能.最后说一句本文基于kotlin实现.不明白的地方请在评论区指出. 即刻原效果:个人效果: 分析 从效果图容易看出,图中的功能主要分为两个部分: 左侧大拇指动画 右侧的文字动画 拓展的功能包括:文字变换模式(全部和部分) 改变文字和未改变文字的间隔和颜色,文字始终位于中心位

  • Android仿iPhone日期时间选择器详解

    本文实例为大家分享了Android仿iPhone时间选择器的具体代码,供大家参考,具体内容如下 先看效果图 如何使用 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import android.app.Activity; import android.app.AlertDialog; import

随机推荐