Android 省,市,区选择器

作者: cnbzlj 发布时间: 2019-09-19 浏览: 2726 次 编辑

不废话,需求:做一个好看的省,市,区三级联动的选择器,怎么办?

1,需要WheelView基础控件自行扩展实现逻辑,可直接添加基础控件库,Gradle 依赖:

compile 'com.contrarywind:wheelview:4.0.9'
2,布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
 
    <include
        layout="@layout/include_pickerview_topbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/pickerview_topbar_height" />
 
    <LinearLayout
        android:id="@+id/optionspicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="horizontal">
 
        <com.contrarywind.view.WheelView
            android:id="@+id/options1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
 
        <com.contrarywind.view.WheelView
            android:id="@+id/options2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
 
        <com.contrarywind.view.WheelView
            android:id="@+id/options3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>
 
 
</LinearLayout>

3,初始化PopWindow:

private void initPopwindow() {
 
        popupWindow = new PopupWindow(this);
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View mMenuView = inflater.inflate(R.layout.my_pickerview_options, null);
 
        Button btnCancel, btnSubmit;
 
        options1 = mMenuView.findViewById(R.id.options1);
        options2 = mMenuView.findViewById(R.id.options2);
        options3 = mMenuView.findViewById(R.id.options3);
        btnCancel = mMenuView.findViewById(R.id.btnCancel);
        btnSubmit = mMenuView.findViewById(R.id.btnSubmit);
        btnCancel.setTextColor(ContextCompat.getColor(RegisterShopActivity.this, R.color.colorCancel));
        btnSubmit.setTextColor(ContextCompat.getColor(RegisterShopActivity.this, R.color.colorSub));
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                String opt1tx = mOptionsItems1.size() > 0 ?
                        mOptionsItems1.get(options1.getCurrentItem()) : "";
                String opt2tx = mOptionsItems2.size() > 0 ?
                        mOptionsItems2.get(options2.getCurrentItem()) : "";
                String opt3tx = mOptionsItems3.size() > 0 ?
                        mOptionsItems3.get(options3.getCurrentItem()) : "";
                String tx = opt1tx + opt2tx + opt3tx;
                tvShopAddress.setText(tx);
                tvShopAddress.setTextColor(ContextCompat.getColor(RegisterShopActivity.this, R.color.colorText));
                isSelectAdress = true;
                popupWindow.dismiss();
            }
        });
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });
 
        options1.setCyclic(false);
        options2.setCyclic(false);
        options3.setCyclic(false);
        options1.setDividerColor(Color.BLACK);
        options2.setDividerColor(Color.BLACK);
        options3.setDividerColor(Color.BLACK);
//        options1.setIsOptions(true);
//        options2.setIsOptions(true);
//        options3.setIsOptions(true);
 
        options1.setAdapter(new ArrayWheelAdapter(mOptionsItems1));
        options2.setAdapter(new ArrayWheelAdapter(mOptionsItems2));
        options3.setAdapter(new ArrayWheelAdapter(mOptionsItems3));
 
        options1.setTextSize(20);
        options2.setTextSize(20);
        options3.setTextSize(20);
 
        options1.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(int index) {
//                Toast.makeText(RegisterShopActivity.this, "" + mOptionsItems1.get(index), Toast.LENGTH_SHORT).show();
                int province_id = province.get(index).getProvince_id();
                getCity(province_id + "");
            }
        });
        options2.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(int index) {
//                Toast.makeText(RegisterShopActivity.this, "" + mOptionsItems2.get(index), Toast.LENGTH_SHORT).show();
                long city_id = city.get(index).getCity_id();
                getCounty(city_id + "");
            }
        });
 
 
        popupWindow.setContentView(mMenuView);
        popupWindow.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
        popupWindow.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        ColorDrawable dw = new ColorDrawable(0x000000);
        popupWindow.setBackgroundDrawable(dw);
        popupWindow.setFocusable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setAnimationStyle(R.style.picker_view_slide_anim);
 
        // 设置popupWindow取消的点击事件,即popupWindow消失后,屏幕的透明度,全透明,就回复原状态
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                WindowUtil.backgroundAlpha(RegisterShopActivity.this, 1f);
            }
        });
    }

4,显示PopWindow:

private void showPopwindow() {
 
        popupWindow.showAtLocation(rlBankInfo,
                Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
        WindowUtil.backgroundAlpha(this, 0.4f);
        llDetailAddress.setVisibility(View.VISIBLE);
    }

5,设置数据

activity.options1.setAdapter(new ArrayWheelAdapter(activity.mOptionsItems1));
                                activity.options1.setCurrentItem(0);

这里我的省,市,区的数据都是服务器请求获取的。获取省数据时,需要获取市的数据。获取市的数据后,需要获取区的数据。每次滑动省,市时,需要获取数据。