欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 实现IOS 滚轮选择控件的实例(源码下载)

程序员文章站 2023-11-15 20:40:58
 android 实现ios 滚轮选择控件的实例 最近根据项目需要,整理了一个相对比较全面的 wheelview 使用控件,借用之前看到的一句话来说,就是站在巨...

 android 实现ios 滚轮选择控件的实例

最近根据项目需要,整理了一个相对比较全面的 wheelview 使用控件,借用之前看到的一句话来说,就是站在巨人肩膀上,进行了一些小调整。

这里先贴上效果图

Android 实现IOS 滚轮选择控件的实例(源码下载)

一般常用的时间选择格式,,单项选择,以及城市联动,这里基本都可以满足了。

这里把 单项选择,和 日期时间选择 给提出到 util 类中,代码如下:

public class util {

  /**
   * 时间选择回调
   */
  public interface timerpickercallback {
    void ontimeselect(string date);
  }

  /**
   * 弹出时间选择
   *
   * @param context
   * @param type   timerpickerview 中定义的 选择时间类型
   * @param format  时间格式化
   * @param callback 时间选择回调
   */
  public static void alerttimerpicker(context context, timepickerview.type type, final string format, final timerpickercallback callback) {
    timepickerview pvtime = new timepickerview(context, type);
    //控制时间范围
    //    calendar calendar = calendar.getinstance();
    //    pvtime.setrange(calendar.get(calendar.year) - 20, calendar.get(calendar.year));
    pvtime.settime(new date());
    pvtime.setcyclic(false);
    pvtime.setcancelable(true);
    //时间选择后回调
    pvtime.setontimeselectlistener(new timepickerview.ontimeselectlistener() {

      @override
      public void ontimeselect(date date) {
//            tvtime.settext(gettime(date));
        simpledateformat sdf = new simpledateformat(format);
        callback.ontimeselect(sdf.format(date));
      }
    });
    pvtime.settextsize(16);
    //弹出时间选择器
    pvtime.show();
  }


  /**
   * 底部滚轮点击事件回调
   */
  public interface onwheelviewclick {
    void onclick(view view, int postion);
  }

  /**
   * 弹出底部滚轮选择
   *
   * @param context
   * @param list
   * @param click
   */
  public static void alertbottomwheeloption(context context, arraylist<?> list, final onwheelviewclick click) {

    final popupwindow popupwindow = new popupwindow();

    view view = layoutinflater.from(context).inflate(r.layout.layout_bottom_wheel_option, null);
    textview tv_confirm = (textview) view.findviewbyid(r.id.btnsubmit);
    final wheelview wv_option = (wheelview) view.findviewbyid(r.id.wv_option);
    wv_option.setadapter(new arraywheeladapter(list));
    wv_option.setcyclic(false);
    wv_option.settextsize(16);
    tv_confirm.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view view) {
        popupwindow.dismiss();
        click.onclick(view, wv_option.getcurrentitem());
      }
    });

    view.findviewbyid(r.id.btncancel).setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view view) {
        // todo: 2016/8/11 0011 取消
        popupwindow.dismiss();
      }
    });
    view.setontouchlistener(new view.ontouchlistener() {
      @override
      public boolean ontouch(view view, motionevent motionevent) {
        int top = view.findviewbyid(r.id.ll_container).gettop();
        if (motionevent.getaction() == motionevent.action_up) {
          int y = (int) motionevent.gety();
          if (y < top) {
            popupwindow.dismiss();
          }
        }
        return true;
      }
    });
    popupwindow.setcontentview(view);
    popupwindow.setoutsidetouchable(true);
    popupwindow.setfocusable(true);
    popupwindow.setbackgrounddrawable(new bitmapdrawable());
    popupwindow.setwidth(viewgroup.layoutparams.match_parent);
    popupwindow.setheight(viewgroup.layoutparams.match_parent);
    popupwindow.showatlocation(((viewgroup) ((activity) context).findviewbyid(android.r.id.content)).getchildat(0), gravity.center, 0, 0);
  }
}

单项选择

这里是模拟传入 arraylist 形式的 string 类型 :

// 单项选择
    for (int i = 0; i <= 10; i++) {
      mlist.add("模拟数据" + i);
    }

    tv_single_option.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        util.alertbottomwheeloption(mainactivity.this, mlist, new util.onwheelviewclick() {
          @override
          public void onclick(view view, int postion) {
            toast.maketext(mainactivity.this, mlist.get(postion), toast.length_short).show();
          }
        });
      }
    });

补充:我们实际项目中用法可能是传入一个实体对象,那么我们到 wheelview 中找到设置显示内容的方法:

/**
   * 根据传进来的对象反射出getpickerviewtext()方法,来获取需要显示的值
   * @param item
   * @return
   */
  private string getcontenttext(object item) {
    string contenttext = item.tostring();
    try {
      class<?> clz = item.getclass();
      method m = clz.getmethod(getpickerviewtext);
      contenttext = m.invoke(item, new object[0]).tostring();
    } catch (nosuchmethodexception e) {
    } catch (invocationtargetexception e) {
    } catch (illegalaccessexception e) {
    } catch (exception e){
    }
    return contenttext;
  }

根据以上代码,可以看到如果是一个实体对象,那么就是通过对象内部定义的一个方法名为 getpickerviewtext(静态常量=”getpickerviewtext”)的返回值来作为显示内容,

所以在创建对象的时候,要注意在对象内部添加一个 getpickerviewtext()方法,代码如下:

public class typebean {

  private int id;
  private string name;

  public typebean(int id, string name) {
    this.id = id;
    this.name = name;
  }

  public int getid() {
    return id;
  }

  public void setid(int id) {
    this.id = id;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  //这个用来显示在pickerview上面的字符串,pickerview会通过反射获取getpickerviewtext方法显示出来。
  public string getpickerviewtext() {
    //这里还可以判断文字超长截断再提供显示
    return name;
  }
}

日期选择

这里是传入 选择日期类型,和 回调时间格式 就能直接得到想要的结果,

@override
  public void onclick(view v) {
    string format = "";
    timepickerview.type type = null;
    switch (v.getid()) {
      case r.id.btn_ymdhm:
        type = timepickerview.type.all;
        format = "yyyy-mm-dd hh:mm";
        break;
      case r.id.btn_ymdh:
        type = timepickerview.type.year_month_day_hour;
        format = "yyyy-mm-dd hh";
        break;
      case r.id.btn_ymd:
        type = timepickerview.type.year_month_day;
        format = "yyyy-mm-dd";
        break;
      case r.id.btn_mdhm:
        type = timepickerview.type.month_day_hour_min;
        format = "mm-dd hh:mm";
        break;
      case r.id.btn_hm:
        type = timepickerview.type.hours_mins;
        format = "hh:mm";
        break;
      case r.id.btn_ym:
        type = timepickerview.type.year_month;
        format = "yyyy-mm";
        break;
    }
    util.alerttimerpicker(this, type, format, new util.timerpickercallback() {
      @override
      public void ontimeselect(string date) {
        toast.maketext(testactivity.this, date, toast.length_short).show();
      }
    });

  }

条件选择

private arraylist<provincebean> options1items = new arraylist<provincebean>();
private arraylist<arraylist<string>> options2items = new arraylist<arraylist<string>>();
private arraylist<arraylist<arraylist<string>>> options3items = new arraylist<arraylist<arraylist<string>>>();

optionspickerview pvoptions;

private void showoptions(){
    //选项选择器
    pvoptions = new optionspickerview(this);
    // 初始化三个列表数据
    datamodel.initdata(options1items, options2items, options3items);

    //三级联动效果
    pvoptions.setpicker(options1items, options2items, options3items, true);
    //设置选择的三级单位
//    pwoptions.setlabels("省", "市", "区");
    pvoptions.settitle("选择城市");
    pvoptions.setcyclic(false, false, false);
    //设置默认选中的三级项目
    //监听确定选择按钮
    pvoptions.setselectoptions(1, 1, 1);
    pvoptions.settextsize(18);
    pvoptions.setonoptionsselectlistener(new optionspickerview.onoptionsselectlistener() {

      @override
      public void onoptionsselect(int options1, int option2, int options3) {
        //返回的分别是三个级别的选中位置
        string tx = options1items.get(options1).getpickerviewtext()
            + options2items.get(options1).get(option2)
            + options3items.get(options1).get(option2).get(options3);
        tvoptions.settext(tx);
        vmasker.setvisibility(view.gone);
      }
    });
    //点击弹出选项选择器
    tvoptions.setonclicklistener(new view.onclicklistener() {

      @override
      public void onclick(view v) {
        pvoptions.show();
      }
    });
  }

基本使用就这些了,也没什么技术含量,只是作为常用工具整理,也希望能给大家带来方便。

感谢一下提供该组件源码的大神。

demo地址

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!