基于Android-PickerView 的简单封装与使用。

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);

    }
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个高仿 IOS PickerView 控件的库。代码来自:https://github.com/saiwu-bigkoo/Android-PickerView ,在原有代码基础上进行封装,并提供了一些修改属性方法。后期如有时间,将会对原有代码进行优化。预览使用首先需要在 build.gradle 文件中添加依赖:dependencies {    compile 'com.airsaid.library:pickerviewlibrary:1.0.0' }添加好依赖后,重新同步工程。可根据需求使用如下选择器:城市选择:        CityPickerView mCityPickerView = new CityPickerView(this);         // 设置点击外部是否消失 //        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();时间选择: //     TimePickerView 同样有上面设置样式的方法         TimePickerView mTimePickerView = new TimePickerView(this, TimePickerView.Type.YEAR_MONTH_DAY);         // 设置是否循环 //        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();选项选择:        OptionsPickerView<String> 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();
作者jaaksi,源码pickerview,一个非常好用的 Android PickerView 库,内部提供 3 种常用类型的 Picker,支持扩展自定义 Picker:TimePicker:时间选择器,支持聚合模式的时间选择器(合并 v1.x 的 MixedTimePicker)OptionPicker:联动选择器效果图  APKDemo App下载连接PickerView READMEPicker通过组装 PickerView 实现常用的 Picker 选择器。上面已经列举提供的 3 中常用的 Picker。BasePickerPicker 基类:封装了 TopBar,PickerView 容器,create and add PickerView 方法,Picker 弹窗等方法。 三种 Picker 都继承自 BasePicker,你也可以继承它扩展自己的 Picker。APIapidescriptionsetPickerBackgroundColor设置 picker 背景setPadding设置 PickerView 父容器 padding 单位:pxsetTag给 Picker 设置 tag,用于区分不同的 picker 等。用法同 View setTaggetRootLayout获取 PickerView 的父容器,创建 DefaultTopBar 时必须指定setOnPickerChooseListener设置 picker 取消,确定按钮监听。可用于拦截选中操作setTopBar设置自定义 TopBarsetInterceptor设置拦截器createPickerView创建 PickerViewgetPickerViews获取 Picker 中所有的 pickerview 集合addPicker将创建的 PickerView 添加到上面集合中,createPickerView 内部已调用该方法findPickerViewByTag通过 tag 找到对应的 PickerViewisScrolling是否滚动未停止。滚动未停止的时候,不响应 Picker 的取消,确定按键getPickerDialog获取 Picker 弹窗。可以在 new 之后设置 dialog 属性show显示 picker 弹窗对比 github 上最受欢迎的同类库 Android-PickerView ,本库将 TopBar 等通用相关逻辑封装在基类中,并提供代码中创建 PickerView 方法,不需要再依赖 xml。用户自定义 Picker 时,继承 BasePicker,只需要处理自己的逻辑即可,简单便捷。 而对 Android-PickerView 来说,实现自定义 Picker,依然需要处理 TopBar 等逻辑,造成大量重复代码。TopBarTopBar:TopBar 通过抽象接口 ITopBar 来管理,实现 Picker 与 TopBar 的解耦。提供默认实现 DefaultTopBar。可实现接口定制自己的 TopBar。   public interface ITopBar {      /**       * @return topbar view       */      View getTopBarView();      /**       * @return 取消按钮 view       */      View getBtnCancel();      /**       * @return 确定按钮 view       */      View getBtnConfirm();      /**       * @return title view       */      TextView getTitleView();    }DefaultTopBar APIapidescriptionsetDividerColor设置 topbar bottom line colorsetDividerHeight设置 bottom divider line heightgetDivider获取 TopBar bottom linegetTitleView获取 TopBar title viewInterceptor拦截器:用于在 pickerview 创建时拦截,设置 pickerview 的属性。Picker 内部并不提供对 PickerView 的设置方法,而是通过 Interceptor 实现。这种设计用来实现 PickerPickerView 的属性设置完美解耦。   private void init(){     mTimePicker.setInterceptor(new 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值