package com.bigkoo.pickerviewdemo;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bigkoo.pickerview.OptionsPickerView;
import com.bigkoo.pickerview.TimePickerView;
import com.bigkoo.pickerview.listener.CustomListener;
import com.bigkoo.pickerviewdemo.bean.CardBean;
import com.bigkoo.pickerviewdemo.bean.ProvinceBean;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ArrayList<ProvinceBean> options1Items = new ArrayList<>();
private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();
/* private ArrayList<ArrayList<ArrayList<IPickerViewData>>> options3Items = new ArrayList<>();*/
private Button btn_Time, btn_Options,btn_CustomOptions,btn_CustomTime,btn_no_linkage,btn_to_Fragment;
private TimePickerView pvTime, pvCustomTime;
private OptionsPickerView pvOptions, pvCustomOptions, pvNoLinkOptions;
private ArrayList<CardBean> cardItem = new ArrayList<>();
private ArrayList<String> food = new ArrayList<>();
private ArrayList<String> clothes = new ArrayList<>();
private ArrayList<String> computer = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//最好等数据加载完毕再初始化并显示,以免数据量大的时候,还未加载完毕就显示,造成APP崩溃。
initTimePicker();
initCustomTimePicker();
initOptionData();
initOptionPicker();
initCustomOptionPicker();
initNoLinkOptionsPicker();
btn_Time = (Button) findViewById(R.id.btn_Time);
btn_Options = (Button) findViewById(R.id.btn_Options);
btn_CustomOptions = (Button) findViewById(R.id.btn_CustomOptions);
btn_CustomTime = (Button) findViewById(R.id.btn_CustomTime);
btn_no_linkage = (Button) findViewById(R.id.btn_no_linkage);
btn_to_Fragment = (Button) findViewById(R.id.btn_fragment);
btn_Time.setOnClickListener(this);
btn_Options.setOnClickListener(this);
btn_CustomOptions.setOnClickListener(this);
btn_CustomTime.setOnClickListener(this);
btn_no_linkage.setOnClickListener(this);
btn_to_Fragment.setOnClickListener(this);
findViewById(R.id.btn_GotoJsonData).setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_Time && pvTime != null) {
// pvTime.setDate(Calendar.getInstance());
/* pvTime.show(); //show timePicker*/
pvTime.show(v);//弹出时间选择器,传递参数过去,回调的时候则可以绑定此view
} else if (v.getId() == R.id.btn_Options && pvOptions != null) {
pvOptions.show(); //弹出条件选择器
} else if (v.getId() == R.id.btn_CustomOptions && pvCustomOptions != null) {
pvCustomOptions.show(); //弹出自定义条件选择器
} else if (v.getId() == R.id.btn_CustomTime && pvCustomTime != null) {
pvCustomTime.show(); //弹出自定义时间选择器
} else if (v.getId() == R.id.btn_no_linkage && pvNoLinkOptions != null) {//不联动数据选择器
pvNoLinkOptions.show();
}else if (v.getId() == R.id.btn_GotoJsonData){//跳转到 省市区解析示例页面
startActivity(new Intent(MainActivity.this,JsonDataActivity.class));
}else if (v.getId() == R.id.btn_fragment){//跳转到 fragment
startActivity(new Intent(MainActivity.this,FragmentTestActivity.class));
}
}
private void initNoLinkOptionsPicker() {// 不联动的多级选项
pvNoLinkOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
String str = "food:" + food.get(options1)
+ "\nclothes:" + clothes.get(options2)
+ "\ncomputer:" + computer.get(options3);
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
}).build();
pvNoLinkOptions.setNPicker(food, clothes, computer);
}
private void initTimePicker() {
//控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
//因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2013, 0, 23);
Calendar endDate = Calendar.getInstance();
endDate.set(2019, 11, 28);
//时间选择器
pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {//选中事件回调
// 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
/*btn_Time.setText(getTime(date));*/
Button btn = (Button) v;
btn.setText(getTime(date));
}
})
//年月日时分秒 的显示与否,不设置则默认全部显示
.setType(new boolean[]{false, false, false, true, true, false})
.setLabel("","","","点","分","")
.isCenterLabel(false)
.setDividerColor(Color.DKGRAY)
.setContentSize(21)
.setDate(selectedDate)
.setRangDate(startDate, endDate)
.setBackgroundId(0x00FFFFFF) //设置外部遮罩颜色
.setDecorView(null)
.build();
}
private void initCustomTimePicker() {
/**
* @description
*
* 注意事项:
* 1.自定义布局中,id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有,否则会报空指针.
* 具体可参考demo 里面的两个自定义layout布局。
* 2.因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
* setRangDate方法控制起始终止时间(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
*/
Calendar selectedDate = Calendar.getInstance();//系统当前时间
Calendar startDate = Calendar.getInstance();
startDate.set(2014, 1, 23);
Calendar endDate = Calendar.getInstance();
endDate.set(2027, 2, 28);
//时间选择器 ,自定义布局
pvCustomTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {//选中事件回调
btn_CustomTime.setText(getTime(date));
}
})
/*.setType(TimePickerView.Type.ALL)//default is all
.setCancelText("Cancel")
.setSubmitText("Sure")
.setContentSize(18)
.setTitleSize(20)
.setTitleText("Title")
.setTitleColor(Color.BLACK)
/*.setDividerColor(Color.WHITE)//设置分割线的颜色
.setTextColorCenter(Color.LTGRAY)//设置选中项的颜色
.setLineSpacingMultiplier(1.6f)//设置两横线之间的间隔倍数
.setTitleBgColor(Color.DKGRAY)//标题背景颜色 Night mode
.setBgColor(Color.BLACK)//滚轮背景颜色 Night mode
.setSubmitColor(Color.WHITE)
.setCancelColor(Color.WHITE)*/
/*.gravity(Gravity.RIGHT)// default is center*/
.setDate(selectedDate)
.setRangDate(startDate, endDate)
.setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {
@Override
public void customLayout(View v) {
final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
tvSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomTime.returnData();
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomTime.dismiss();
}
});
}
})
.setType(new boolean[]{true, true, true, false, false, false})
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.setDividerColor(Color.RED)
.build();
}
private String getTime(Date date) {//可根据需要自行截取数据显示
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
private void initOptionData() {
/**
* 注意:如果是添加JavaBean实体数据,则实体类需要实现 IPickerViewData 接口,
* PickerView会通过getPickerViewText方法获取字符串显示出来。
*/
getCardData();
getNoLinkData();
//选项1
options1Items.add(new ProvinceBean(0, "广东", "描述部分", "其他数据"));
options1Items.add(new ProvinceBean(1, "湖南", "描述部分", "其他数据"));
options1Items.add(new ProvinceBean(2, "广西", "描述部分", "其他数据"));
//选项2
ArrayList<String> options2Items_01 = new ArrayList<>();
options2Items_01.add("广州");
options2Items_01.add("佛山");
options2Items_01.add("东莞");
options2Items_01.add("珠海");
ArrayList<String> options2Items_02 = new ArrayList<>();
options2Items_02.add("长沙");
options2Items_02.add("岳阳");
options2Items_02.add("株洲");
options2Items_02.add("衡阳");
ArrayList<String> options2Items_03 = new ArrayList<>();
options2Items_03.add("桂林");
options2Items_03.add("玉林");
options2Items.add(options2Items_01);
options2Items.add(options2Items_02);
options2Items.add(options2Items_03);
/*--------数据源添加完毕---------*/
}
private void initOptionPicker() {//条件选择器初始化
/**
* 注意 :如果是三级联动的数据(省市区等),请参照 JsonDataActivity 类里面的写法。
*/
pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
//返回的分别是三个级别的选中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(options2)
/* + options3Items.get(options1).get(options2).get(options3).getPickerViewText()*/;
btn_Options.setText(tx);
}
})
.setTitleText("城市选择")
.setContentTextSize(20)//设置滚轮文字大小
.setDividerColor(Color.GREEN)//设置分割线的颜色
.setSelectOptions(0, 1)//默认选中项
.setBgColor(Color.BLACK)
.setTitleBgColor(Color.DKGRAY)
.setTitleColor(Color.LTGRAY)
.setCancelColor(Color.YELLOW)
.setSubmitColor(Color.YELLOW)
.setTextColorCenter(Color.LTGRAY)
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.setLabels("省", "市", "区")
.setBackgroundId(0x66000000) //设置外部遮罩颜色
.build();
//pvOptions.setSelectOptions(1,1);
/*pvOptions.setPicker(options1Items);//一级选择器*/
pvOptions.setPicker(options1Items, options2Items);//二级选择器
/*pvOptions.setPicker(options1Items, options2Items,options3Items);//三级选择器*/
}
private void initCustomOptionPicker() {//条件选择器初始化,自定义布局
/**
* @description
*
* 注意事项:
* 自定义布局中,id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有,否则会报空指针。
* 具体可参考demo 里面的两个自定义layout布局。
*/
pvCustomOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3, View v) {
//返回的分别是三个级别的选中位置
String tx = cardItem.get(options1).getPickerViewText();
btn_CustomOptions.setText(tx);
}
})
.setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {
@Override
public void customLayout(View v) {
final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
final TextView tvAdd = (TextView) v.findViewById(R.id.tv_add);
ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
tvSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.returnData();
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.dismiss();
}
});
tvAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCardData();
pvCustomOptions.setPicker(cardItem);
}
});
}
})
.isDialog(true)
.build();
pvCustomOptions.setPicker(cardItem);//添加数据
}
private void getCardData() {
for (int i = 0; i < 5; i++) {
cardItem.add(new CardBean(i, "No.ABC12345 " + i));
}
}
private void getNoLinkData() {
food.add("KFC");
food.add("MacDonald");
food.add("Pizza hut");
clothes.add("Nike");
clothes.add("Adidas");
clothes.add("Anima");
computer.add("ASUS");
computer.add("Lenovo");
computer.add("Apple");
computer.add("HP");
}
}