Android 实现四级下拉选择

实现效果如下图

首先创建 

滚轮视图,可设置是否循环模式,实现OnScrollChangedListener接口以监听滚轮变化
public class EasyPickerView extends View {

    // 文字大小
    private int textSize;
    // 颜色,默认Color.BLACK
    private int textColor;
    // 文字之间的间隔,默认10dp
    private int textPadding;
    // 文字最大放大比例,默认2.0f
    private float textMaxScale;
    // 文字最小alpha值,范围0.0f~1.0f,默认0.4f
    private float textMinAlpha;
    // 是否循环模式,默认是
    private boolean isRecycleMode;
    // 正常状态下最多显示几个文字,默认3(偶数时,边缘的文字会截断)
    private int maxShowNum;

    private TextPaint textPaint;
    private Paint.FontMetrics fm;

    private Scroller scroller;
    private VelocityTracker velocityTracker;
    private int minimumVelocity;
    private int maximumVelocity;
    private int scaledTouchSlop;

    // 数据
    private List<SelectBean> dataList = new ArrayList<>(0);
    // 中间x坐标
    private int cx;
    // 中间y坐标
    private int cy;
    // 文字最大宽度
    private float maxTextWidth;
    // 文字高度
    private int textHeight;
    // 实际内容宽度
    private int contentWidth;
    // 实际内容高度
    private int contentHeight;

    // 按下时的y坐标
    private float downY;
    // 本次滑动的y坐标偏移值
    private float offsetY;
    // 在fling之前的offsetY
    private float oldOffsetY;
    // 当前选中项
    private int curIndex;
    private int offsetIndex;

    // 回弹距离
    private float bounceDistance;
    // 是否正处于滑动状态
    private boolean isSliding = false;

    public EasyPickerView(Context context) {
        this(context, null);
    }

    public EasyPickerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EasyPickerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EasyPickerView, defStyleAttr, 0);
        textSize = a.getDimensionPixelSize(R.styleable.EasyPickerView_epvTextSize, (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
        textColor = a.getColor(R.styleable.EasyPickerView_epvTextColor, Color.BLACK);
        textPadding = a.getDimensionPixelSize(R.styleable.EasyPickerView_epvTextPadding, (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()));
        textMaxScale = a.getFloat(R.styleable.EasyPickerView_epvTextMaxScale, 2.0f);
        textMinAlpha = a.getFloat(R.styleable.EasyPickerView_epvTextMinAlpha, 0.4f);
        isRecycleMode = a.getBoolean(R.styleable.EasyPickerView_epvRecycleMode, true);
        maxShowNum = a.getInteger(R.styleable.EasyPickerView_epvMaxShowNum, 3);
        a.recycle();

        textPaint = new TextPaint();
        textPaint.setColor(textColor);
        textPaint.setTextSize(textSize);
        textPaint.setAntiAlias(true);
        fm = textPaint.getFontMetrics();
        textHeight = (int) (fm.bottom - fm.top);

        scroller = new Scroller(context);
        minimumVelocity = ViewConfiguration.get(getContext()).getScaledMinimumFlingVelocity();
        maximumVelocity = ViewConfiguration.get(getContext()).getScaledMaximumFlingVelocity();
        scaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        contentWidth = (int) (maxTextWidth * textMaxScale + getPaddingLeft() + getPaddingRight());
        if (mode != MeasureSpec.EXACTLY) { // wrap_content
            width = contentWidth;
        }

        mode = MeasureSpec.getMode(heightMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        contentHeight = textHeight * maxShowNum + textPadding * maxShowNum;
        if (mode != MeasureSpec.EXACTLY) { // wrap_content
            height = contentHeight + getPaddingTop() + getPaddingBottom();
        }

        cx = width / 2;
        cy = height / 2;

        setMeasuredDimension(width, height);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        addVelocityTracker(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (!scroller.isFinished()) {
                    scroller.forceFinished(true);
                    finishScroll();
                }
                downY = event.getY();
                break;

            case MotionEvent.ACTION_MOVE:
                offsetY = event.getY() - downY;
                if (isSliding || Math.abs(offsetY) > scaledTouchSlop) {
                    isSliding = true;
                    reDraw();
                }
                break;

            case MotionEvent.ACTION_UP:
                int scrollYVelocity = 2 * getScrollYVelocity() / 3;
                if (Math.abs(scrollYVelocity) > minimumVelocity) {
                    oldOffsetY = offsetY;
                    scroller.fling(0, 0, 0, scrollYVelocity, 0, 0, -Integer.MAX_VALUE, Integer.MAX_VALUE);
                    invalidate();
                } else {
                    finishScroll();
                }

                // 没有滑动,则判断点击事件
                if (!isSliding) {
                    if (downY < contentHeight / 3)
                        moveBy(-1);
                    else if (downY > 2 * contentHeight / 3)
                        moveBy(1);
                }

                isSliding = false;
                recycleVelocityTracker();
                break;
        }
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (null != dataList && dataList.size() > 0) {
            canvas.clipRect(
                    cx - contentWidth / 2,
                    cy - contentHeight / 2,
                    cx + contentWidth / 2,
                    cy + contentHeight / 2
            );

            // 绘制文字,从当前中间项往前、后一共绘制maxShowNum个字
            int size = dataList.size();
            int centerPadding = textHeight + textPadding;
            int half = maxShowNum / 2 + 1;
            for (int i = -half; i <= half; i++) {
                int index = curIndex - offsetIndex + i;

                if (isRecycleMode) {
                    if (index < 0)
                        index = (index + 1) % dataList.size() + dataList.size() - 1;
                    else if (index > dataList.size() - 1)
                        index = index % dataList.size();
                }

                if (index >= 0 && index < size) {
                    // 计算每个字的中间y坐标
                    int tempY = cy + i * centerPadding;
                    tempY += offsetY % centerPadding;

                    // 根据每个字中间y坐标到cy的距离,计算出scale值
                    float scale = 1.0f - (1.0f * Math.abs(tempY - cy) / centerPadding);

                    // 根据textMaxScale,计算出tempScale值,即实际text应该放大的倍数,范围 1~textMaxScale
                    float tempScale = scale * (textMaxScale - 1.0f) + 1.0f;
                    tempScale = tempScale < 1.0f ? 1.0f : tempScale;

                    // 计算文字alpha值
                    float textAlpha = textMinAlpha;
                    if (textMaxScale != 1) {
                        float tempAlpha = (tempScale - 1) / (textMaxScale - 1);
                        textAlpha = (1 - textMinAlpha) * tempAlpha + textMinAlpha;
                    }

                    textPaint.setTextSize(textSize * tempScale);
                    textPaint.setAlpha((int) (255 * textAlpha));

                    // 绘制
                    Paint.FontMetrics tempFm = textPaint.getFontMetrics();
                    String text = dataList.get(index).getName();
                    float textWidth = textPaint.measureText(text);
                    canvas.drawText(text, cx - textWidth / 2, tempY - (tempFm.ascent + tempFm.descent) / 2, textPaint);
                }
            }
        }
    }

    @Override
    public void computeScroll() {
        if (scroller.computeScrollOffset()) {
            offsetY = oldOffsetY + scroller.getCurrY();

            if (!scroller.isFinished())
                reDraw();
            else
                finishScroll();
        }
    }

    private void addVelocityTracker(MotionEvent event) {
        if (velocityTracker == null)
            velocityTracker = VelocityTracker.obtain();

        velocityTracker.addMovement(event);
    }

    private void recycleVelocityTracker() {
        if (velocityTracker != null) {
            velocityTracker.recycle();
            velocityTracker = null;
        }
    }

    private int getScrollYVelocity() {
        velocityTracker.computeCurrentVelocity(1000, maximumVelocity);
        int velocity = (int) velocityTracker.getYVelocity();
        return velocity;
    }

    private void reDraw() {
        // curIndex需要偏移的量
        int i = (int) (offsetY / (textHeight + textPadding));
        if (isRecycleMode || (curIndex - i >= 0 && curIndex - i < dataList.size())) {
            if (offsetIndex != i) {
                offsetIndex = i;

                if (null != onScrollChangedListener)
                    onScrollChangedListener.onScrollChanged(getNowIndex(-offsetIndex));
            }
            postInvalidate();
        } else {
            finishScroll();
        }
    }

    private void finishScroll() {
        // 判断结束滑动后应该停留在哪个位置
        int centerPadding = textHeight + textPadding;
        float v = offsetY % centerPadding;
        if (v > 0.5f * centerPadding)
            ++offsetIndex;
        else if (v < -0.5f * centerPadding)
            --offsetIndex;

        // 重置curIndex
        curIndex = getNowIndex(-offsetIndex);

        // 计算回弹的距离
        bounceDistance = offsetIndex * centerPadding - offsetY;
        offsetY += bounceDistance;

        // 更新
        if (null != onScrollChangedListener)
            onScrollChangedListener.onScrollFinished(curIndex);

        // 重绘
        reset();
        postInvalidate();
    }

    private int getNowIndex(int offsetIndex) {
        int index = curIndex + offsetIndex;
        if (isRecycleMode) {
            if (index < 0)
                index = (index + 1) % dataList.size() + dataList.size() - 1;
            else if (index > dataList.size() - 1)
                index = index % dataList.size();
        } else {
            if (index < 0)
                index = 0;
            else if (index > dataList.size() - 1)
                index = dataList.size() - 1;
        }
        return index;
    }

    private void reset() {
        offsetY = 0;
        oldOffsetY = 0;
        offsetIndex = 0;
        bounceDistance = 0;
    }

    /**
     * 设置要显示的数据
     *
     * @param dataList 要显示的数据
     */
    public void setDataList(List<SelectBean> dataList) {
        this.dataList.clear();
        this.dataList.addAll(dataList);

        // 更新maxTextWidth
        if (null != dataList && dataList.size() > 0) {
            int size = dataList.size();
            for (int i = 0; i < size; i++) {
                float tempWidth;
                if (StringUtils.isEmpty(dataList.get(i).getName())) {
                    tempWidth = textPaint.measureText("");
                } else {

                    tempWidth = textPaint.measureText(dataList.get(i).getName());
                }
                if (tempWidth > maxTextWidth)
                    maxTextWidth = tempWidth;
            }
            curIndex = 0;
        }
        requestLayout();
        invalidate();
    }

    /**
     * 获取当前状态下,选中的下标
     *
     * @return 选中的下标
     */
    public int getCurIndex() {
        return getNowIndex(-offsetIndex);
    }

    /**
     * 滚动到指定位置
     *
     * @param index 需要滚动到的指定位置
     */
    public void moveTo(int index) {
        if (index < 0 || index >= dataList.size() || curIndex == index)
            return;

        if (!scroller.isFinished())
            scroller.forceFinished(true);

        finishScroll();

        int dy = 0;
        int centerPadding = textHeight + textPadding;
        if (!isRecycleMode) {
            dy = (curIndex - index) * centerPadding;
        } else {
            int offsetIndex = curIndex - index;
            int d1 = Math.abs(offsetIndex) * centerPadding;
            int d2 = (dataList.size() - Math.abs(offsetIndex)) * centerPadding;

            if (offsetIndex > 0) {
                if (d1 < d2)
                    dy = d1; // ascent
                else
                    dy = -d2; // descent
            } else {
                if (d1 < d2)
                    dy = -d1; // descent
                else
                    dy = d2; // ascent
            }
        }
        scroller.startScroll(0, 0, 0, dy, 500);
        invalidate();
    }

    /**
     * 滚动指定的偏移量
     *
     * @param offsetIndex 指定的偏移量
     */
    public void moveBy(int offsetIndex) {
        moveTo(getNowIndex(offsetIndex));
    }

    /**
     * 滚动发生变化时的回调接口
     */
    public interface OnScrollChangedListener {
        public void onScrollChanged(int curIndex);

        public void onScrollFinished(int curIndex);
    }

    private OnScrollChangedListener onScrollChangedListener;

    public void setOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener) {
        this.onScrollChangedListener = onScrollChangedListener;
    }
}

然后实现一个四级选择的弹窗,弹窗可以根据多少级数据显示几个下拉选择(最多四个,逻辑上可以修改成N级,把固定的滚动视图切换成列表,然后加载上去)

public class SlideFDialogs extends Dialog {
    private boolean isCancelable = false;
    private boolean isBackCancelable = false;
    private Context mContext;   //上下文
    private List<SelectBean> list = new ArrayList<>(0); //数据
    private List<SelectBean> selectBeans2 = new ArrayList<>();
    private List<SelectBean> selectBeans3 = new ArrayList<>();
    private List<SelectBean> selectBeans4 = new ArrayList<>();
    private List<SelectBean> selectBeans = new ArrayList<>();
    private int selectPos; //默认选中位置
    private int selectPos2; //默认选中位置
    private int selectPos3; //默认选中位置
    private int selectPos4; //默认选中位置
    private OnSelectListener mSelectListener; //监听


    public SlideFDialogs(@NonNull Context context, List<SelectBean> list, boolean isCancelable, boolean isBackCancelable) {
        super(context, R.style.SlideDialog);
        this.mContext = context;
        this.isCancelable = isCancelable;
        this.isBackCancelable = isBackCancelable;
        this.list = list;
        this.selectPos = 0;
        this.selectPos2 = 0;
        this.selectPos3 = 0;
        this.selectPos4 = 0;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置View
        setContentView(R.layout.select_slide_template_four);
        //设置点击物理返回键是否可关闭弹框
        setCancelable(isCancelable);
        //设置点击弹框外是否可关闭弹框
        setCanceledOnTouchOutside(isBackCancelable);
        //设置view显示位置
        Window window = this.getWindow();
        window.setGravity(Gravity.BOTTOM);
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        window.setAttributes(params);
        //初始化控件
        TextView tv_cancel = findViewById(R.id.tv_cancel);
        TextView tv_agree = findViewById(R.id.tv_agree);
        EasyPickerView pickerView = findViewById(R.id.pickerView);
        EasyPickerView pickerView2 = findViewById(R.id.pickerView2);
        EasyPickerView pickerView3 = findViewById(R.id.pickerView3);
        EasyPickerView pickerView4 = findViewById(R.id.pickerView4);
        pickerView.setVisibility(View.GONE);
        pickerView2.setVisibility(View.GONE);
        pickerView3.setVisibility(View.GONE);
        pickerView4.setVisibility(View.GONE);
        //取消点击事件
        tv_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //取消
                mSelectListener.onCancel();

                dismiss();
            }
        });
        //确认点击事件
        tv_agree.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String txt = "";
                //确认
                if (selectBeans != null && selectBeans.size() > 0) {
                    txt = selectBeans.get(selectPos).getName();
                    if (selectBeans2 != null && selectBeans2.size() > 0) {
                        txt = txt + selectBeans2.get(selectPos2).getName();
                        if (selectBeans3 != null && selectBeans3.size() > 0) {
                            txt = txt + selectBeans3.get(selectPos3).getName();
                            if (selectBeans4 != null && selectBeans4.size() > 0) {
                                txt = txt + selectBeans4.get(selectPos4).getName();
                                mSelectListener.onAgree(selectBeans4.get(selectPos4), txt);
                            } else {
                                mSelectListener.onAgree(selectBeans3.get(selectPos3), txt);
                            }
                        } else {
                            mSelectListener.onAgree(selectBeans2.get(selectPos2), txt);
                        }


                    } else {
                        mSelectListener.onAgree(selectBeans.get(selectPos), txt);
                    }
                } else {
                    mSelectListener.onAgree(null, txt);

                }
                dismiss();
            }
        });

        for (SelectBean gridbean : list
        ) {
            selectBeans.add(gridbean);
        }
        if (selectBeans.size() > 0) {
            pickerView.setVisibility(View.VISIBLE);
            for (SelectBean bean : selectBeans) {
                if (bean.getList() != null && bean.getList().size() > 0) {
                    pickerView2.setVisibility(View.VISIBLE);
                    for (SelectBean bean1 : bean.getList()) {
                        if (bean1.getList() != null && bean1.getList().size() > 0) {
                            pickerView3.setVisibility(View.VISIBLE);
                            for (SelectBean bean2 : bean1.getList()) {
                                if (bean2.getList() != null && bean2.getList().size() > 0) {
                                    pickerView4.setVisibility(View.VISIBLE);
                                }

                            }
                        }

                    }
                }

            }
        }


        //设置数据
        pickerView.setDataList(selectBeans);
        if (selectBeans.size() > 0) {

            selectBeans2.addAll(selectBeans.get(0).getList());
            if (selectBeans2.get(0).getList() != null && selectBeans2.get(0).getList().size() > 0) {
                selectBeans3=new ArrayList<>();
                selectBeans3.addAll(selectBeans.get(0).getList().get(0).getList());
                if (selectBeans3 != null && selectBeans3.size() > 0) {
                    selectBeans4=new ArrayList<>();
                    selectBeans4.addAll(selectBeans.get(0).getList().get(0).getList().get(0).getList());
                }
            }
        }


        if (selectBeans2 != null && selectBeans2.size() > 0) {

            pickerView2.setDataList(selectBeans2);
        }
        if (selectBeans3 != null && selectBeans3.size() > 0) {

            pickerView3.setDataList(selectBeans3);
        }
        if (selectBeans4 != null && selectBeans4.size() > 0) {

            pickerView4.setDataList(selectBeans4);
        }
        //监听数据
        pickerView.setOnScrollChangedListener(new EasyPickerView.OnScrollChangedListener() {
            @Override
            public void onScrollChanged(int curIndex) {
                //滚动时选中项发生变化

            }

            @Override
            public void onScrollFinished(int curIndex) {
                //滚动结束
                selectPos = curIndex;
                selectPos2 = 0;
                selectPos3 = 0;
                selectPos4 = 0;
                if (selectBeans2 != null) {
                    selectBeans2.clear();
                }
                if (selectBeans3 != null) {
                    selectBeans3.clear();
                }

                if (selectBeans4 != null) {
                    selectBeans4.clear();
                }

                selectBeans2.addAll(list.get(selectPos).getList());
                if (selectBeans2 != null && selectBeans2.size() > 0) {
                    pickerView2.setDataList(selectBeans2);
                    if (selectBeans2.get(selectPos2).getList()!=null){
                        selectBeans3.addAll(list.get(selectPos).getList().get(selectPos2).getList());
                        if (selectBeans3 != null && selectBeans3.size() > 0) {
                            pickerView3.setDataList(selectBeans3);
                            if (selectBeans3.get(selectPos3).getList()!=null){
                                selectBeans4.addAll(list.get(selectPos).getList().get(selectPos2).getList().get(selectPos3).getList());
                                if (selectBeans4 != null && selectBeans4.size() > 0) {
                                    pickerView4.setDataList(selectBeans4);
                                }
                            }

                        }
                    }

                } else {
                    selectBeans2 = new ArrayList<>();
                    selectBeans3 = new ArrayList<>();
                    selectBeans4 = new ArrayList<>();
                    pickerView2.setDataList(selectBeans2);
                    pickerView3.setDataList(selectBeans3);
                    pickerView4.setDataList(selectBeans4);
                }
            }
        }); //设置数据
//
        //监听数据
        pickerView2.setOnScrollChangedListener(new EasyPickerView.OnScrollChangedListener() {
            @Override
            public void onScrollChanged(int curIndex) {
                //滚动时选中项发生变化

            }

            @Override
            public void onScrollFinished(int curIndex) {
                //滚动结束
                selectPos2 = curIndex;
                selectPos3 = 0;
                selectPos4 = 0;

                if (selectBeans3 != null) {
                    selectBeans3.clear();
                }

                if (selectBeans4 != null) {
                    selectBeans4.clear();
                }
                if (selectBeans2.size() > 0) {
                    if (selectBeans2.get(selectPos2).getList()!=null){
                        selectBeans3.addAll(list.get(selectPos).getList().get(selectPos2).getList());
                        if (selectBeans3 != null && selectBeans3.size() > 0) {
                            pickerView3.setDataList(selectBeans3);
                            if (selectBeans3.get(selectPos3).getList()!=null){
                                selectBeans4.addAll(list.get(selectPos).getList().get(selectPos2).getList().get(selectPos3).getList());

                                if (selectBeans4 != null && selectBeans4.size() > 0) {
                                    pickerView4.setDataList(selectBeans4);
                                }
                            }

                        }
                    }

                }


            }
        });
        pickerView3.setOnScrollChangedListener(new EasyPickerView.OnScrollChangedListener() {
            @Override
            public void onScrollChanged(int curIndex) {
                //滚动时选中项发生变化

            }

            @Override
            public void onScrollFinished(int curIndex) {
                //滚动结束
                selectPos3 = curIndex;
                selectPos4 = 0;
                if (selectBeans4 != null) {
                    selectBeans4.clear();
                }
                if (selectBeans3.get(selectPos3).getList()!=null){

                    selectBeans4.addAll(list.get(selectPos).getList().get(selectPos2).getList().get(selectPos3).getList());
                    if (selectBeans4 != null && selectBeans4.size() > 0) {
                        pickerView4.setDataList(selectBeans4);
                    }
                }

            }
        });
        pickerView4.setOnScrollChangedListener(new EasyPickerView.OnScrollChangedListener() {
            @Override
            public void onScrollChanged(int curIndex) {
                //滚动时选中项发生变化

            }

            @Override
            public void onScrollFinished(int curIndex) {
                //滚动结束
                selectPos4 = curIndex;

            }
        });

    }

    public interface OnSelectListener {
        //取消
        void onCancel();

        //确认
        void onAgree(SelectBean selectBean, String text);

    }

    public void setOnSelectClickListener(OnSelectListener listener) {
        this.mSelectListener = listener;
    }
}

然后我们通过页面调用四级选择弹窗

public class MainActivity extends AppCompatActivity {
    List<SelectBean> selectBeans = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //按钮ID绑定
        Button button = findViewById(R.id.show_dialog);
        TextView textView = findViewById(R.id.show_content);


        for (int i = 0; i < 10; i++) {
            SelectBean selectBean1 = new SelectBean();
            selectBean1.setName("第一级" + i);
            selectBean1.setId(i);
            List<SelectBean> list1 = new ArrayList<>();
            for (int j = 0; j < 10; j++) {
                SelectBean selectBean2 = new SelectBean();
                selectBean2.setName("第二级" + i+j);
                selectBean2.setId(j);
                List<SelectBean> list2 = new ArrayList<>();
                for (int m = 0; m < 10; m++) {
                    SelectBean selectBean3 = new SelectBean();
                    selectBean3.setName("第三级" + i+j+m);
                    selectBean3.setId(m);
                    List<SelectBean> list3 = new ArrayList<>();
                    for (int n = 0; n < 10; n++) {
                        SelectBean selectBean4 = new SelectBean();
                        selectBean4.setName("第四级" +i+j+m+ n);
                        selectBean4.setId(n);
                        list3.add(selectBean4);

                    }
                    selectBean3.setList(list3);
                    list2.add(selectBean3);
                }
                selectBean2.setList(list2);
                list1.add(selectBean2);

            }
            selectBean1.setList(list1);
            selectBeans.add(selectBean1);

        }
        //按钮点击事件
        button.setOnClickListener(v -> {
            showDilog(selectBeans, textView);

        });
    }

    public void showDilog(List<SelectBean> selectBeans, TextView textView) {

        SlideFDialogs slideDialog = new SlideFDialogs(this, selectBeans, true, true);
        slideDialog.setOnSelectClickListener(new SlideFDialogs.OnSelectListener() {
            @Override
            public void onCancel() {

            }

            @Override
            public void onAgree(SelectBean selectBean, String text) {
                textView.setText(text);
                textView.setTag(selectBean.getId());
            }
        });
        slideDialog.show();
    }
}

这样就可以了,弹窗的四级选择字体显示还有点问题,可以自己调整下

EasyPickerView 里面的字体大小就可以了

完整的demo地址:https://download.csdn.net/download/ymr1248/88571757

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YMR_DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值