当前位置: 移动技术网 > 移动技术>移动开发>Android > Android高仿IOS 滚轮选择控件

Android高仿IOS 滚轮选择控件

2019年07月24日  | 移动技术网移动技术  | 我要评论

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

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

这里把 单项选择,和 日期时间选择 给提出到 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();
   }
  });
 }

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

点击下载:源码

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网