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

本文详细介绍了一个功能强大的Android滚轮选择器组件——Android-PickerView,它支持时间选择和三级联动,适用于地址选择等场景。文章提供了如何在项目中引入依赖、使用工具类进行封装的方法,并展示了如何实现基本的一级、二级选择器及时间选择器的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值