package com.hdl.widget.pickerview.view; import android.content.Context; import android.graphics.Typeface; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import com.hdl.widgetxm.R; import com.hdl.widget.pickerview.adapter.ArrayWheelAdapter; import com.hdl.widget.pickerview.listener.OnOptionsSelectChangeListener; import java.util.List; import com.hdl.widget.pickerview.contrarywind.listener.OnItemSelectedListener; import com.hdl.widget.pickerview.contrarywind.view.WheelView; /** * Created by JLChen on 2019/9/25 */ public class HDLPickerView extends LinearLayout { private WheelView wv_option1, wv_option2, wv_option3; private Context context; // private HDLWheelOptions mHDLWheelOptions; // private LinearLayout hdl_pickerview_ll; // protected PickerOptions mPickerOptions; private List mOptions1Items; private List> mOptions2Items; private List>> mOptions3Items; private boolean linkage = false;//默认联动 private boolean isRestoreItem; //切换时,还原第一项 private OnItemSelectedListener wheelListener_option1; private OnItemSelectedListener wheelListener_option2; private OnOptionsSelectChangeListener optionsSelectChangeListener; //文字的颜色和分割线的颜色 private int textColorOut; private int textColorCenter; private int dividerColor; private WheelView.DividerType dividerType; // 条目间距倍数 private float lineSpacingMultiplier; public HDLPickerView(Context context) { super(context); this.context = context; initView(context); } public HDLPickerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context = context; initView(context); // initAttrs(context, attrs); } //初始化UI,可根据业务需求设置默认值。 private void initView(Context context) { LayoutInflater.from(context).inflate(R.layout.hdl_widget_pickerview, this, true); wv_option1 = (WheelView) findViewById(R.id.hdl_options1); wv_option2 = (WheelView) findViewById(R.id.hdl_options2); wv_option3 = (WheelView) findViewById(R.id.hdl_options3); } //不联动情况下 public void setNPicker(List options1Items, List options2Items, List options3Items) { linkage = false; // 选项1 wv_option1.setAdapter(new ArrayWheelAdapter(options1Items));// 设置显示数据 wv_option1.setCurrentItem(0);// 初始化时显示的数据 // 选项2 if (options2Items != null) { wv_option2.setAdapter(new ArrayWheelAdapter(options2Items));// 设置显示数据 } wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据 // 选项3 if (options3Items != null) { wv_option3.setAdapter(new ArrayWheelAdapter(options3Items));// 设置显示数据 } wv_option3.setCurrentItem(wv_option3.getCurrentItem()); wv_option1.setIsOptions(true); wv_option2.setIsOptions(true); wv_option3.setIsOptions(true); setCyclic(false,false,false); if (optionsSelectChangeListener != null) { wv_option1.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(int index) { optionsSelectChangeListener.onOptionsSelectChanged(index, wv_option2.getCurrentItem(), wv_option3.getCurrentItem()); } }); } if (options2Items == null) { wv_option2.setVisibility(View.GONE); } else { wv_option2.setVisibility(View.VISIBLE); if (optionsSelectChangeListener != null) { wv_option2.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(int index) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, wv_option3.getCurrentItem()); } }); } } if (options3Items == null) { wv_option3.setVisibility(View.GONE); } else { wv_option3.setVisibility(View.VISIBLE); if (optionsSelectChangeListener != null) { wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(int index) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index); } }); } } } public void setPicker(List options1Items, List> options2Items, List>> options3Items) { this.mOptions1Items = options1Items; this.mOptions2Items = options2Items; this.mOptions3Items = options3Items; setCyclic(false,false,false); linkage = true; // 选项1 wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items));// 设置显示数据 wv_option1.setCurrentItem(0);// 初始化时显示的数据 // 选项2 if (mOptions2Items != null) { wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(0)));// 设置显示数据 } wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据 // 选项3 if (mOptions3Items != null) { wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(0).get(0)));// 设置显示数据 } wv_option3.setCurrentItem(wv_option3.getCurrentItem()); wv_option1.setIsOptions(true); wv_option2.setIsOptions(true); wv_option3.setIsOptions(true); if (this.mOptions2Items == null) { wv_option2.setVisibility(View.GONE); } else { wv_option2.setVisibility(View.VISIBLE); } if (this.mOptions3Items == null) { wv_option3.setVisibility(View.GONE); } else { wv_option3.setVisibility(View.VISIBLE); } // 联动监听器 wheelListener_option1 = new OnItemSelectedListener() { @Override public void onItemSelected(int index) { int opt2Select = 0; if (mOptions2Items == null) {//只有1级联动数据 if (optionsSelectChangeListener != null) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), 0, 0); } } else { if (!isRestoreItem) { opt2Select = wv_option2.getCurrentItem();//上一个opt2的选中位置 //新opt2的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项 opt2Select = opt2Select >= mOptions2Items.get(index).size() - 1 ? mOptions2Items.get(index).size() - 1 : opt2Select; } wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(index))); wv_option2.setCurrentItem(opt2Select); if (mOptions3Items != null) { wheelListener_option2.onItemSelected(opt2Select); } else {//只有2级联动数据,滑动第1项回调 if (optionsSelectChangeListener != null) { optionsSelectChangeListener.onOptionsSelectChanged(index, opt2Select, 0); } } } } }; wheelListener_option2 = new OnItemSelectedListener() { @Override public void onItemSelected(int index) { if (mOptions3Items != null) { int opt1Select = wv_option1.getCurrentItem(); opt1Select = opt1Select >= mOptions3Items.size() - 1 ? mOptions3Items.size() - 1 : opt1Select; index = index >= mOptions2Items.get(opt1Select).size() - 1 ? mOptions2Items.get(opt1Select).size() - 1 : index; int opt3 = 0; if (!isRestoreItem) { // wv_option3.getCurrentItem() 上一个opt3的选中位置 //新opt3的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项 opt3 = wv_option3.getCurrentItem() >= mOptions3Items.get(opt1Select).get(index).size() - 1 ? mOptions3Items.get(opt1Select).get(index).size() - 1 : wv_option3.getCurrentItem(); } wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(wv_option1.getCurrentItem()).get(index))); wv_option3.setCurrentItem(opt3); //3级联动数据实时回调 if (optionsSelectChangeListener != null) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, opt3); } } else {//只有2级联动数据,滑动第2项回调 if (optionsSelectChangeListener != null) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, 0); } } } }; // 添加联动监听 if (options1Items != null && linkage) { wv_option1.setOnItemSelectedListener(wheelListener_option1); } if (options2Items != null && linkage) { wv_option2.setOnItemSelectedListener(wheelListener_option2); } if (options3Items != null && linkage && optionsSelectChangeListener != null) { wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(int index) { optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index); } }); } } public void setTextContentSize(int textSize) { wv_option1.setTextSize(textSize); wv_option2.setTextSize(textSize); wv_option3.setTextSize(textSize); } private void setTextColorOut() { wv_option1.setTextColorOut(textColorOut); wv_option2.setTextColorOut(textColorOut); wv_option3.setTextColorOut(textColorOut); } private void setTextColorCenter() { wv_option1.setTextColorCenter(textColorCenter); wv_option2.setTextColorCenter(textColorCenter); wv_option3.setTextColorCenter(textColorCenter); } private void setDividerColor() { wv_option1.setDividerColor(dividerColor); wv_option2.setDividerColor(dividerColor); wv_option3.setDividerColor(dividerColor); } private void setDividerType() { wv_option1.setDividerType(dividerType); wv_option2.setDividerType(dividerType); wv_option3.setDividerType(dividerType); } private void setLineSpacingMultiplier() { wv_option1.setLineSpacingMultiplier(lineSpacingMultiplier); wv_option2.setLineSpacingMultiplier(lineSpacingMultiplier); wv_option3.setLineSpacingMultiplier(lineSpacingMultiplier); } /** * 设置选项的单位 * * @param label1 单位 * @param label2 单位 * @param label3 单位 */ public void setLabels(String label1, String label2, String label3) { if (label1 != null) { wv_option1.setLabel(label1); } if (label2 != null) { wv_option2.setLabel(label2); } if (label3 != null) { wv_option3.setLabel(label3); } } /** * 设置x轴偏移量 */ public void setTextXOffset(int x_offset_one, int x_offset_two, int x_offset_three) { wv_option1.setTextXOffset(x_offset_one); wv_option2.setTextXOffset(x_offset_two); wv_option3.setTextXOffset(x_offset_three); } /** * 设置是否循环滚动 * * @param cyclic 是否循环 */ public void setCyclic(boolean cyclic) { wv_option1.setCyclic(cyclic); wv_option2.setCyclic(cyclic); wv_option3.setCyclic(cyclic); } /** * 设置字体样式 * * @param font 系统提供的几种样式 */ public void setTypeface(Typeface font) { wv_option1.setTypeface(font); wv_option2.setTypeface(font); wv_option3.setTypeface(font); } /** * 分别设置第一二三级是否循环滚动 * * @param cyclic1,cyclic2,cyclic3 是否循环 */ public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) { wv_option1.setCyclic(cyclic1); wv_option2.setCyclic(cyclic2); wv_option3.setCyclic(cyclic3); } /** * 返回当前选中的结果对应的位置数组 因为支持三级联动效果,分三个级别索引,0,1,2。 * 在快速滑动未停止时,点击确定按钮,会进行判断,如果匹配数据越界,则设为0,防止index出错导致崩溃。 * * @return 索引数组 */ public int[] getCurrentItems() { int[] currentItems = new int[3]; currentItems[0] = wv_option1.getCurrentItem(); if (mOptions2Items != null && mOptions2Items.size() > 0) {//非空判断 currentItems[1] = wv_option2.getCurrentItem() > (mOptions2Items.get(currentItems[0]).size() - 1) ? 0 : wv_option2.getCurrentItem(); } else { currentItems[1] = wv_option2.getCurrentItem(); } if (mOptions3Items != null && mOptions3Items.size() > 0) {//非空判断 currentItems[2] = wv_option3.getCurrentItem() > (mOptions3Items.get(currentItems[0]).get(currentItems[1]).size() - 1) ? 0 : wv_option3.getCurrentItem(); } else { currentItems[2] = wv_option3.getCurrentItem(); } return currentItems; } public void setCurrentItems(int option1, int option2, int option3) { if (linkage) { itemSelected(option1, option2, option3); } else { wv_option1.setCurrentItem(option1); wv_option2.setCurrentItem(option2); wv_option3.setCurrentItem(option3); } } private void itemSelected(int opt1Select, int opt2Select, int opt3Select) { if (mOptions1Items != null) { wv_option1.setCurrentItem(opt1Select); } if (mOptions2Items != null) { wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(opt1Select))); wv_option2.setCurrentItem(opt2Select); } if (mOptions3Items != null) { wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(opt1Select).get(opt2Select))); wv_option3.setCurrentItem(opt3Select); } } /** * 设置间距倍数,但是只能在1.2-4.0f之间 * * @param lineSpacingMultiplier */ public void setLineSpacingMultiplier(float lineSpacingMultiplier) { this.lineSpacingMultiplier = lineSpacingMultiplier; setLineSpacingMultiplier(); } /** * 设置分割线的颜色 * * @param dividerColor */ public void setDividerColor(int dividerColor) { this.dividerColor = dividerColor; setDividerColor(); } /** * 设置分割线的类型 * * @param dividerType */ public void setDividerType(WheelView.DividerType dividerType) { this.dividerType = dividerType; setDividerType(); } /** * 设置分割线之间的文字的颜色 * * @param textColorCenter */ public void setTextColorCenter(int textColorCenter) { this.textColorCenter = textColorCenter; setTextColorCenter(); } /** * 设置指定位置 分割线之间的文字的颜色 * * @param textColorCenter * @param optionId */ public void setTextColorCenter(int textColorCenter, int optionId) { if(optionId == 0){ wv_option1.setTextColorCenter(textColorCenter); }else if(optionId == 1){ wv_option2.setTextColorCenter(textColorCenter); }else if(optionId == 2){ wv_option3.setTextColorCenter(textColorCenter); } } /** * 设置指定位置 分割线之间的文字的颜色 * @param textColorCenter1 * @param textColorCenter2 * @param textColorCenter3 */ public void setTextColorCenterAlone(int textColorCenter1, int textColorCenter2, int textColorCenter3) { wv_option1.setTextColorCenter(textColorCenter1); wv_option2.setTextColorCenter(textColorCenter2); wv_option3.setTextColorCenter(textColorCenter3); } /** * 统一设置设置指定位置 分割线之间的文字的颜色 * * @param textColorCenter */ public void setTextColorCenterAll(int textColorCenter) { wv_option1.setTextColorCenter(textColorCenter); wv_option2.setTextColorCenter(textColorCenter); wv_option3.setTextColorCenter(textColorCenter); } // /** // * 设置指定位置 分割线之间的文字的颜色 // * // * @param bEnable // * @param optionId // */ // public void setOptionViewEnable(int bEnable, int optionId) { // if(optionId == 0){ // wv_option1.setEnabled(bEnable); // }else if(optionId == 1){ // wv_option2.setTextColorCenter(textColorCenter); // }else if(optionId == 2){ // wv_option3.setTextColorCenter(textColorCenter); // } // } /** * 设置分割线以外文字的颜色 * * @param textColorOut */ public void setTextColorOut(int textColorOut) { this.textColorOut = textColorOut; setTextColorOut(); } /** * Label 是否只显示中间选中项的 * * @param isCenterLabel */ public void isCenterLabel(boolean isCenterLabel) { wv_option1.isCenterLabel(isCenterLabel); wv_option2.isCenterLabel(isCenterLabel); wv_option3.isCenterLabel(isCenterLabel); } public void setOptionsSelectChangeListener(OnOptionsSelectChangeListener optionsSelectChangeListener) { this.optionsSelectChangeListener = optionsSelectChangeListener; } public void setLinkage(boolean linkage) { this.linkage = linkage; } }