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.widget.pickerview.adapter.ArrayWheelAdapter;
|
import com.hdl.widget.pickerview.contrarywind.listener.OnItemSelectedListener;
|
import com.hdl.widget.pickerview.contrarywind.view.WheelView;
|
import com.hdl.widget.pickerview.listener.OnOptionsSelectChangeListener;
|
import com.hdl.widgetxm.R;
|
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.HashMap;
|
import java.util.List;
|
|
/**
|
* Created by JLChen on 2019/9/25
|
* 不指定泛型
|
*/
|
public class HDLPickerViewNT 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<String> mOptions1Items;
|
private List<List<String>> mOptions2Items;
|
private List<List<List<String>>> 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 HDLPickerViewNT(Context context) {
|
super(context);
|
this.context = context;
|
initView(context);
|
}
|
|
public HDLPickerViewNT(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<String> options1Items, List<String> options2Items, List<String> 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 setPickerHashMap(List<String> options1Items,
|
// HashMap<String, ArrayList<String>> options2Items) {
|
// List<List<String>> newoptions2Items = new ArrayList();
|
// for(int i=0;i<options2Items.size();i++){
|
// newoptions2Items.add(options2Items.get(options1Items.get(i)));
|
// }
|
//
|
// setPicker(options1Items, newoptions2Items,null);
|
// }
|
// public void setPickerArrayList(ArrayList<String> options1Items,
|
// ArrayList<ArrayList<String>> options2Items) {
|
// List<List<String>> newoptions2Items = new ArrayList();
|
// for(int i=0;i<options2Items.size();i++){
|
// newoptions2Items.add(options2Items.get(i));
|
// }
|
//
|
// setPicker(options1Items, newoptions2Items,null);
|
// }
|
|
public void setPickerString(List<String> options1Items, List<String> options2Items) {
|
try {
|
List<List<String>> options2Itemss = new ArrayList<>();
|
for(int i =0; i< options2Items.size();i++){
|
String[] arr = options2Items.get(i).split(">-<");
|
List<String> list = Arrays.asList(arr);
|
options2Itemss.add(list);
|
}
|
this.setPicker(options1Items, options2Itemss, null);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
|
public void setPicker(List<String> options1Items,
|
List<List<String>> options2Items) {
|
|
setPicker(options1Items,options2Items,null);
|
}
|
|
|
public void setPicker(List<String> options1Items,
|
List<List<String>> options2Items,
|
List<List<List<String>>> 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;
|
}
|
|
|
|
}
|