这篇文章讲一下PickerView选择器。先看下效果图:
效果图中看到:包括 城市选择,时间选择,选项选择
看下代码:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private TimePickerView mTimePickerView;
private CityPickerView mCityPickerView;
private OptionsPickerView<String> mOptionsPickerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCityPickerView = new CityPickerView(this);
mTimePickerView = new TimePickerView(this, TimePickerView.Type.YEAR_MONTH_DAY);
mOptionsPickerView = new OptionsPickerView<>(this);
}
public void selectCity(View v){
// 设置点击外部是否消失
// mCityPickerView.setCancelable(true);
// 设置滚轮字体大小
// mCityPickerView.setTextSize(18f);
// 设置标题
// mCityPickerView.setTitle("我是标题");
// 设置取消文字
// mCityPickerView.setCancelText("我是取消文字");
// 设置取消文字颜色
// mCityPickerView.setCancelTextColor(Color.GRAY);
// 设置取消文字大小
// mCityPickerView.setCancelTextSize(14f);
// 设置确定文字
// mCityPickerView.setSubmitText("我是确定文字");
// 设置确定文字颜色
// mCityPickerView.setSubmitTextColor(Color.BLACK);
// 设置确定文字大小
// mCityPickerView.setSubmitTextSize(14f);
// 设置头部背景
// mCityPickerView.setHeadBackgroundColor(Color.RED);
mCityPickerView.setOnCitySelectListener(new CityPickerView.OnCitySelectListener() {
@Override
public void onCitySelect(String str) {
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
});
mCityPickerView.show();
}
public void selectTime(View v){
// TimePickerView 同样有上面设置样式的方法
// 设置是否循环
// mTimePickerView.setCyclic(true);
// 设置滚轮文字大小
// mTimePickerView.setTextSize(TimePickerView.TextSize.SMALL);
// 设置时间可选范围(结合 setTime 方法使用,必须在)
// Calendar calendar = Calendar.getInstance();
// mTimePickerView.setRange(calendar.get(Calendar.YEAR) - 100, calendar.get(Calendar.YEAR));
// 设置选中时间
// mTimePickerView.setTime(new Date());
mTimePickerView.setOnTimeSelectListener(new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
Toast.makeText(MainActivity.this, format.format(date), Toast.LENGTH_SHORT).show();
}
});
mTimePickerView.show();
}
public void selectOption(View v){
mOptionsPickerView = new OptionsPickerView<>(this);
final ArrayList<String> list = new ArrayList<>();
list.add("男");
list.add("女");
// 设置数据
mOptionsPickerView.setPicker(list);
// 设置选项单位
// mOptionsPickerView.setLabels("性");
mOptionsPickerView.setOnOptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int option1, int option2, int option3) {
String sex = list.get(option1);
Toast.makeText(MainActivity.this, sex, Toast.LENGTH_SHORT).show();
}
});
mOptionsPickerView.show();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(mTimePickerView.isShowing()){
mTimePickerView.dismiss();
return true;
}
if(mCityPickerView.isShowing()){
mCityPickerView.dismiss();
return true;
}
if(mOptionsPickerView.isShowing()){
mOptionsPickerView.dismiss();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
}
CityPickerView.java 城市选择器
/**
* Class desc:
*/
public class CityPickerView extends OptionsPickerView {
private final Context mContext;
// 省数据集合
private ArrayList<String> mListProvince = new ArrayList<>();
// 市数据集合
private ArrayList<ArrayList<String>> mListCity = new ArrayList<>();
// 区数据集合
private ArrayList<ArrayList<ArrayList<String>>> mListArea = new ArrayList<>();
private JSONObject mJsonObj;
public CityPickerView(Context context) {
super(context);
mContext = context;
// 初始化Json对象
initJsonData();
// 初始化Json数据
initJsonDatas();
initCitySelect();
}
private void initCitySelect() {
setTitle("选择城市");
setPicker(mListProvince, mListCity, mListArea, true);
setCyclic(false, false, false);
setSelectOptions(0, 0, 0);
setOnOptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int option1, int option2, int option3) {
if (mOnCitySelectListener != null) {
if (mListCity.size() > option1 && mListCity.get(option1).size() > option2) {
if (mListArea.size() > option1 && mListArea.get(option1).size() > option2
&& mListArea.get(option1).get(option2).size() > option3) {
String str = mListProvince.get(option1).concat(mListCity.get(option1)
.get(option2)).concat(mListArea.get(option1).get(option2).get(option3));
mOnCitySelectListener.onCitySelect(str);
}
}
}
}
});
}
/**
* 从assert文件夹中读取省市区的json文件,然后转化为json对象
*/
private void initJsonData() {
AssetManager assets = mContext.getAssets();
try {
InputStream is = assets.open("city.json");
byte[] buf = new byte[is.available()];
is.read(buf);
String json = new String(buf, "UTF-8");
mJsonObj = new JSONObject(json);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化Json数据,并释放Json对象
*/
private void initJsonDatas() {
try {
JSONArray jsonArray = mJsonObj.getJSONArray("citylist");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonP = jsonArray.getJSONObject(i);// 获取每个省的Json对象
String province = jsonP.getString("name");
ArrayList<String> options2Items_01 = new ArrayList<>();
ArrayList<ArrayList<String>> options3Items_01 = new ArrayList<>();
JSONArray jsonCs = jsonP.getJSONArray("city");
for (int j = 0; j < jsonCs.length(); j++) {
JSONObject jsonC = jsonCs.getJSONObject(j);// 获取每个市的Json对象
String city = jsonC.getString("name");
options2Items_01.add(city);// 添加市数据
ArrayList<String> options3Items_01_01 = new ArrayList<>();
JSONArray jsonAs = jsonC.getJSONArray("area");
for (int k = 0; k < jsonAs.length(); k++) {
options3Items_01_01.add(jsonAs.getString(k));// 添加区数据
}
options3Items_01.add(options3Items_01_01);
}
mListProvince.add(province);// 添加省数据
mListCity.add(options2Items_01);
mListArea.add(options3Items_01);
}
} catch (JSONException e) {
e.printStackTrace();
}
mJsonObj = null;
}
public OnCitySelectListener mOnCitySelectListener;
public interface OnCitySelectListener {
void onCitySelect(String str);
}
public void setOnCitySelectListener(OnCitySelectListener listener) {
this.mOnCitySelectListener = listener;
}
}
TimePickerView.java 时间选择器
/**
* 时间选择器
*/
public class TimePickerView extends BasePickerView implements View.OnClickListener {
public enum Type {
ALL, YEAR_MONTH_DAY, HOURS_MINS, MONTH_DAY_HOUR_MIN, YEAR_MONTH
}// 四种选择模式,年月日时分,年月日,时分,月日时分
private Context mContext;
private View mHeadView;
private TextView mTxtTitle;
private WheelTime mWheelTime;
private Button mBtnSubmit, mBtnCancel;
public TimePickerView(Context context, Type type) {
super(context);
mContext = context;
initView();
initSelectTime(type);
}
/**
* 初始化 View
*/
private void initView() {
LayoutInflater.from(mContext).inflate(R.layout.pickerview_time, contentContainer);
mHeadView = findViewById(R.id.rlt_head_view);
mTxtTitle = (TextView) findViewById(R.id.tvTitle);
mBtnSubmit = (Button) findViewById(R.id.btnSubmit);
mBtnCancel = (Button) findViewById(R.id.btnCancel);
mBtnSubmit.setOnClickListener(this);
mBtnCancel.setOnClickListener(this);
}
/**
* 初始化默认选中当前时间
*/
private void initSelectTime(Type type) {
View timePickerView = findViewById(R.id.timepicker);
mWheelTime = new WheelTime(timePickerView, type);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
Calendar rangeCalendar = Calendar.getInstance();
setRange(rangeCalendar.get(Calendar.YEAR) - 100, rangeCalendar.get(Calendar.YEAR) + 100);
mWheelTime.setPicker(year, month, day, hours, minute);
}
/**
* 设置可以选择的时间范围
* 要在setTime之前调用才有效果
*
* @param startYear 开始年份
* @param endYear 结束年份
*/
public void setRange(int startYear, int endYear) {
mWheelTime.setStartYear(startYear);
mWheelTime.setEndYear(endYear);
}
/**
* 设置选中时间
*
* @param date 时间
*/
public void setTime(Date date) {
Calendar calendar = Calendar.getInstance();
if (date == null)
calendar.setTimeInMillis(System.currentTimeMillis());
else
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
mWheelTime.setPicker(year, month, day, hours, minute);
}
/**
* 设置是否循环滚动
*
* @param cyclic 是否循环
*/
public void setCyclic(boolean cyclic) {
mWheelTime.setCyclic(cyclic);
}
/**
* 设置头部背景颜色
*/
public void setHeadBackgroundColor(int color) {
mHeadView.setBackgroundColor(color);
}
/**
* 设置标题
*/
public void setTitle(String title) {
mTxtTitle.setText(title);
}
/**
* 设置标题颜色
*/
public void setTitleColor(int resId) {
mTxtTitle.setTextColor(resId);
}
/**
* 设置标题大小
*/
public void setTitleSize(float size) {
mTxtTitle.setTextSize(size);
}
/**
* 设置取消文字
*/
public void setCancelText(String text) {
mBtnCancel.setText(text);
}
/**
* 设置取消文字颜色
*/
public void setCancelTextColor(int resId) {
mBtnCancel.setTextColor(resId);
}
/**
* 设置取消文字大小
*/
public void setCancelTextSize(float size) {
mBtnCancel.setTextSize(size);
}
/**
* 设置确认文字
*/
public void setSubmitText(String text) {
mBtnSubmit.setText(text);
}
/**
* 设置确认文字颜色
*/
public void setSubmitTextColor(int resId) {
mBtnSubmit.setTextColor(resId);
}
/**
* 设置确认文字大小
*/
public void setSubmitTextSize(float size) {
mBtnSubmit.setTextSize(size);
}
/**
* 设置滚动文字大小
*/
public void setTextSize(float size) {
mWheelTime.setTextSize(size);
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btnSubmit) {
if (mTimeSelectListener != null) {
try {
Date date = WheelTime.dateFormat.parse(mWheelTime.getTime());
mTimeSelectListener.onTimeSelect(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
dismiss();
} else if (id == R.id.btnCancel) {
dismiss();
}
}
public class TextSize {
public static final float BIG = 6f;
public static final float DEFAULT = 5f;
public static final float SMALL = 4f;
}
private OnTimeSelectListener mTimeSelectListener;
public interface OnTimeSelectListener {
void onTimeSelect(Date date);
}
public void setOnTimeSelectListener(OnTimeSelectListener timeSelectListener) {
this.mTimeSelectListener = timeSelectListener;
}
}
OptionsPickerView.java 选项选择器
/**
* 条件选择器
*/
public class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener {
private Context mContext;
private OnOptionsSelectListener mOptionsSelectListener;
private WheelOptions<T> mWheelOptions;
private Button mBtnSubmit, mBtnCancel;
private TextView mTxtTitle;
private View mHeadView;
public OptionsPickerView(Context context) {
super(context);
mContext = context;
initView();
}
private void initView() {
LayoutInflater.from(mContext).inflate(R.layout.pickerview_options, contentContainer);
mWheelOptions = new WheelOptions<>(findViewById(R.id.optionspicker));
mHeadView = findViewById(R.id.rlt_head_view);
mTxtTitle = (TextView) findViewById(R.id.tvTitle);
mBtnSubmit = (Button) findViewById(R.id.btnSubmit);
mBtnCancel = (Button) findViewById(R.id.btnCancel);
mBtnSubmit.setOnClickListener(this);
mBtnCancel.setOnClickListener(this);
}
/**
* 设置一级数据
*/
public void setPicker(ArrayList<T> optionsItems) {
mWheelOptions.setPicker(optionsItems, null, null, false);
}
/**
* 设置二级数据
*/
public void setPicker(ArrayList<T> options1Items, ArrayList<ArrayList<T>> options2Items, boolean linkage) {
mWheelOptions.setPicker(options1Items, options2Items, null, linkage);
}
/**
* 设置三级数据
*/
public void setPicker(ArrayList<T> options1Items, ArrayList<ArrayList<T>> options2Items
, ArrayList<ArrayList<ArrayList<T>>> options3Items, boolean linkage) {
mWheelOptions.setPicker(options1Items, options2Items, options3Items, linkage);
}
/**
* 设置选中的item位置
* @param option1 位置
*/
public void setSelectOptions(int option1){
mWheelOptions.setCurrentItems(option1, 0, 0);
}
public void setSelectOptions(int option1, int option2){
mWheelOptions.setCurrentItems(option1, option2, 0);
}
public void setSelectOptions(int option1, int option2, int option3){
mWheelOptions.setCurrentItems(option1, option2, option3);
}
/**
* 设置选项的单位
* @param label1 单位
*/
public void setLabels(String label1){
mWheelOptions.setLabels(label1, null, null);
}
public void setLabels(String label1, String label2){
mWheelOptions.setLabels(label1, label2, null);
}
public void setLabels(String label1, String label2, String label3){
mWheelOptions.setLabels(label1, label2, label3);
}
/**
* 设置是否循环滚动
*/
public void setCyclic(boolean cyclic){
mWheelOptions.setCyclic(cyclic);
}
public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
mWheelOptions.setCyclic(cyclic1, cyclic2, cyclic3);
}
/**
* 设置头部背景颜色
*/
public void setHeadBackgroundColor(int color){
mHeadView.setBackgroundColor(color);
}
/**
* 设置标题
*/
public void setTitle(String title){
mTxtTitle.setText(title);
}
/**
* 设置标题颜色
*/
public void setTitleColor(int resId){
mTxtTitle.setTextColor(resId);
}
/**
* 设置标题大小
*/
public void setTitleSize(float size){
mTxtTitle.setTextSize(size);
}
/**
* 设置取消文字
*/
public void setCancelText(String text){
mBtnCancel.setText(text);
}
/**
* 设置取消文字颜色
*/
public void setCancelTextColor(int resId){
mBtnCancel.setTextColor(resId);
}
/**
* 设置取消文字大小
*/
public void setCancelTextSize(float size){
mBtnCancel.setTextSize(size);
}
/**
* 设置确认文字
*/
public void setSubmitText(String text){
mBtnSubmit.setText(text);
}
/**
* 设置确认文字颜色
*/
public void setSubmitTextColor(int resId){
mBtnSubmit.setTextColor(resId);
}
/**
* 设置确认文字大小
*/
public void setSubmitTextSize(float size){
mBtnSubmit.setTextSize(size);
}
/**
* 设置滚动文字大小
*/
public void setTextSize(float size){
mWheelOptions.setTextSize(size);
}
@Override
public void onClick(View v){
int id = v.getId();
if(id == R.id.btnSubmit){
if(mOptionsSelectListener != null){
int[] optionsCurrentItems = mWheelOptions.getCurrentItems();
mOptionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2]);
}
dismiss();
}else if(id == R.id.btnCancel){
dismiss();
}
}
public interface OnOptionsSelectListener {
void onOptionsSelect(int option1, int option2, int option3);
}
public void setOnOptionsSelectListener(
OnOptionsSelectListener optionsSelectListener) {
this.mOptionsSelectListener = optionsSelectListener;
}
}
源码:http://download.csdn.net/download/lijinweii/9896352