Android高仿IOS 滚轮选择控件
程序员文章站
2024-03-07 18:52:21
最近根据项目需要,整理了一个相对比较全面的 wheelview 使用控件,借用之前看到的一句话来说,就是站在巨人肩膀上,进行了一些小调整。
这里先贴上效果图
一般...
最近根据项目需要,整理了一个相对比较全面的 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(); } }); }
基本使用就这些了,也没什么技术含量,只是作为常用工具整理,也希望能给大家带来方便。
点击下载:源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。