Android-PickerView 是一款功能强大的仿ios 滚轮选择器,支持时间选择和三级联动。
为了方便使用,对这款开源项目做了简单的封装。
首先在项目里引入相关依赖
implementation 'com.contrarywind:Android-PickerView:4.1.8'
基于项目封装工具类。
package com.bjttsf.sale.widget;
import android.content.Context;
import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.view.OptionsPickerView;
import com.bigkoo.pickerview.view.TimePickerView;
import com.bjttsf.sale.R;
import com.contrarywind.interfaces.IPickerViewData;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author
* @create
* @Describe 选择器
*/
public class PikerHelper {
private static PikerHelper mPikerHelper = null;
private PikerSelected mPikerSelected = null;
private TimePikerBack mTimePikerBack = null;
private PikerHelper() {
}
public static PikerHelper getInstance() {
synchronized (PikerHelper.class) {
if (mPikerHelper == null) {
mPikerHelper = new PikerHelper();
}
}
return mPikerHelper;
}
/**
* 一级选择器展示
* @param context
* @param title
* @param list
* @param pikerSelected
* @param <T>
*/
public <T extends IPickerViewData> void showPickerListView(Context context, String title, final List<T> list, PikerSelected pikerSelected) {
mPikerSelected = pikerSelected;
// 弹出选择器
OptionsPickerView pvOptions = new OptionsPickerBuilder(context, (options1, options2, options3, v) -> mPikerSelected.singleBack(list.get(options1)))
.setTitleText(title)
.setDividerColor(context.getResources().getColor(R.color.grey_AEAEAE))
.setTextColorCenter(context.getResources().getColor(R.color.black_686868))
.setContentTextSize(14)
.setCancelColor(context.getResources().getColor(R.color.blue_24A3FF))
.setSubmitColor(context.getResources().getColor(R.color.blue_24A3FF))
.setLineSpacingMultiplier(1.5f)
.build();
pvOptions.setPicker(list);
pvOptions.show();
}
/**
* 二级选择器
* @param context
* @param title
* @param list
* @param lists
* @param pikerSelected
* @param <T>
*/
public <T extends IPickerViewData> void showPickerTermView(Context context, String title, final List<T> list, List<List<T>> lists, PikerSelected pikerSelected) {
mPikerSelected = pikerSelected;
// 弹出选择器
OptionsPickerView pvOptions = new OptionsPickerBuilder(context, (options1, options2, options3, v) -> mPikerSelected.singleBack(list.get(options1)))
.setTitleText(title)
.setDividerColor(context.getResources().getColor(R.color.grey_AEAEAE))
.setTextColorCenter(context.getResources().getColor(R.color.black_686868))
.setContentTextSize(14)
.setCancelColor(context.getResources().getColor(R.color.blue_24A3FF))
.setSubmitColor(context.getResources().getColor(R.color.blue_24A3FF))
.setLineSpacingMultiplier(1.5f)
.build();
pvOptions.setPicker(list, lists);
pvOptions.show();
}
/**
* 支持年月日时分秒的时间选择器
* @param context
* @param title
* @param timePikerBack
*/
public void showTimePikerView(Context context, String title, TimePikerBack timePikerBack) {
mTimePikerBack = timePikerBack;
Calendar startDate = Calendar.getInstance();
Calendar endDate = Calendar.getInstance();
endDate.set(2100, 11, 31, 24, 0, 0);
//时间选择器
//控制年月日时分秒的展示
boolean[] type = new boolean[]{true, true, true, true, true, false};
TimePickerView pvTime = new TimePickerBuilder(context, (date, v) -> mTimePikerBack.dateBack(date)).setRangDate(startDate, endDate)
.setTitleText(title)
.setDividerColor(context.getResources().getColor(R.color.grey_AEAEAE))
.setTextColorCenter(context.getResources().getColor(R.color.black_686868))
.setContentTextSize(14)
.setCancelColor(context.getResources().getColor(R.color.blue_24A3FF))
.setSubmitColor(context.getResources().getColor(R.color.blue_24A3FF))
.setType(type)
.build();
pvTime.show();
}
public interface PikerSelected<T extends IPickerViewData> {
void singleBack(T item);
}
public interface TimePikerBack {
void dateBack(Date date);
}
}
这只是用了其中的基本功能。
基于选择器可以使用本地gson文件做一个地址选择器。
package com.bjttsf.sale.widget;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
import com.bigkoo.pickerview.view.OptionsPickerView;
import com.bjttsf.sale.bean.ProviceListBean;
import com.bjttsf.sale.bean.ProvinceBean;
import com.bjttsf.sale.utils.GsonUtil;
import com.blankj.utilcode.util.ToastUtils;
import com.contrarywind.interfaces.IPickerViewData;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* ************************************************
* ************************************************
*/
public class AddressHelper {
private ProviceListBean proviceListBean;
private List<ProvinceBean> options1Items = new ArrayList<>();
private List<List<ProvinceBean.RegionsBean>> options2Items = new ArrayList<>();
private List<List<List<ProvinceBean.RegionsBean.AreasBean>>> options3Items = new ArrayList<>();
private boolean isHaveData = false;
private AddressSelected mPikerSelected = null;
private static AddressHelper mAddressHelper = null;
private AddressHelper() {
}
public static AddressHelper getInstance() {
synchronized (AddressHelper.class) {
if (mAddressHelper == null) {
mAddressHelper = new AddressHelper();
}
}
return mAddressHelper;
}
/**
* 开启线程读取本地json文件
* 必须先调用
*
* @param context
*/
public void intData(final Context context) {
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
singleThreadPool.execute(new Runnable() {
@Override
public void run() {
// proviceListBean = GsonUtil.GsonToBean(GsonUtil.getJson("province.json", context), ProviceListBean.class);
proviceListBean = GsonUtil.GsonToBean(GsonUtil.getJson("address.json", context), ProviceListBean.class);
getData();
isHaveData = true;
}
});
}
//拿到符合要求的数据
private void getData() {
options1Items = proviceListBean.getProvinces();
for (int i = 0; i < options1Items.size(); i++) {
List<ProvinceBean.RegionsBean> lists = options1Items.get(i).getRegions();
options2Items.add(lists);
List<List<ProvinceBean.RegionsBean.AreasBean>> rglists = new ArrayList<>();
for (int j = 0; j < lists.size(); j++) {
rglists.add(lists.get(j).getAreas());
}
options3Items.add(rglists);
}
}
/**
* 弹出地址选择器
*/
public void showAdressView(Context context, String title, AddressSelected pikerSelected) {
mPikerSelected = pikerSelected;
OptionsPickerView pvOptions = new OptionsPickerBuilder(context, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
//返回的分别是三个级别的选中位置
setSelectedData(options1, options2, options3);
}
})
.setTitleText(title)
.setDividerColor(Color.BLACK)
.setTextColorCenter(Color.BLACK) //设置选中项文字颜色
.setContentTextSize(14)
.build();
if (isHaveData) {
pvOptions.setPicker(options1Items, options2Items, options3Items);
pvOptions.show();
} else {
ToastUtils.showShort("is have no data");
}
}
private void setSelectedData(int options1, int options2, int options3) {
String province = options1Items.get(options1).getName();
String regions = options2Items.get(options1).get(options2).getName();
String areas = options3Items.get(options1).get(options2).get(options3).getName();
String address = "";
List<String> list = new ArrayList<>();
list.add(options1Items.get(options1).getId());
list.add(options2Items.get(options1).get(options2).getId());
list.add(options3Items.get(options1).get(options2).get(options3).getId());
list.add(province);
list.add(regions);
list.add(areas);
if (regions.equals("县")) {
address = province + areas;
} else {
address = province + regions + areas;
}
mPikerSelected.pikerBack(address, list);
}
public interface AddressSelected<T extends IPickerViewData> {
/**
* @param address 省市县拼写的地址
* @param valueList 省市县对应的value集合
*/
void pikerBack(String address, List<String> valueList);
}
}