Android仿京东地址选择器

仿京东地址选择器,第一次选择从省开始,第二次会自动定位到已选择位置,三级地址可以点击切换选择,但是没有实现左右滑动切换;此demo只用一个列表,如果需要左右滑动可以改用TabLayout+ViewPage实现。
首先上效果图
在这里插入图片描述
在这里插入图片描述
一、PopupU.java

public static Dialog showRegionView(Context context, int mType, final String province, final String city, final String area, final OnRegionListener onRegionListener) {
		//创建一个dialog
        final Dialog dialog = new Dialog(context, R.style.DialogCommonStyle);
        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM);
        //添加view
        window.setContentView(R.layout.layout_region);
        //在dialog中自定义一个PopupWindow
        RegionPopupWindow regionPopupWindow = window.findViewById(R.id.regionPpw);
        // 设置历史记录
        regionPopupWindow.setHistory(mType, province, city, area);
        // 设置右上角叉号监听
        regionPopupWindow.setOnForkClickListener(new RegionPopupWindow.OnForkClickListener() {
            @Override
            public void onForkClick() {
                dialog.dismiss();
            }
        });
        // 设置item监听,回调传回结果
        regionPopupWindow.setOnRpwItemClickListener(new RegionPopupWindow.OnRpwItemClickListener() {
            @Override
            public void onRpwItemClick(String selectedProvince, String selectedCity, String selectedArea) {
            	//结果通过回调传给activity
                onRegionListener.onRegionListener(selectedProvince, selectedCity, selectedArea);
                dialog.dismiss();
            }
        });

        dialog.setCanceledOnTouchOutside(true);
        WindowManager.LayoutParams attributes = window.getAttributes();
        attributes.width = PhoneU.getScreenPix(context).widthPixels;// 宽为手机屏幕宽
        attributes.height = PhoneU.getScreenPix(context).heightPixels * 4/5;// 高为手机屏幕高的4/5
        window.setBackgroundDrawableResource(R.color.white);
        window.setAttributes(attributes);
        window.setWindowAnimations(R.style.AnimBottom);
        dialog.show();
        return dialog;
    }

二、RegionPopupWindow.java
代码中注释很清晰,主要说明:上面3个TextVIew显示选择结果,下面列表用的RecyclerView实现,如果需要左右滑动可以改用TabLayout+ViewPage。
三、RegionAdapter.java
这里用3个集合分别记录省/市/县的选中状态,以此来达到在重新选择(编辑)模式下自动选中已选择地址item效果

public void refreshData(List<RegionBean> provinceDatas, int dataType, String checkedProvince, String checkedCity, String checkedArea) {
        this.provinceDatas = provinceDatas;
        this.dataType = dataType;
        this.checkedProvince = checkedProvince;
        this.positionProvince = getProvincePisition(checkedProvince);
        this.positionCity = getCityPosition(checkedProvince, checkedCity);
        this.positionArea = getAreaPosition(checkedProvince, checkedCity, checkedArea);
        // 初始化选中状态false
        if (dataType == DATA_PROVINCE) {
            isCheckedP.clear();
            if (provinceDatas == null) {
                return;
            }
            for (int i = 0; i < provinceDatas.size(); i++) {
                isCheckedP.add(false);
            }
            if (positionProvince != -1) {
                isCheckedP.set(positionProvince, true);
            }
        } else if (dataType == DATA_CITY) {
            isCheckedC.clear();
            if (provinceDatas == null ||
                    provinceDatas.get(positionProvince) == null ||
                    provinceDatas.get(positionProvince).citys == null) {
                return;
            }
            for (int i = 0; i < provinceDatas.get(positionProvince).citys.size(); i++) {
                isCheckedC.add(false);
            }
            if (positionCity != -1) {
                isCheckedC.set(positionCity, true);
            }
        } else if (dataType == DATA_AREA){
            isCheckedA.clear();
            if (provinceDatas == null ||
                    provinceDatas.get(positionProvince) == null ||
                    provinceDatas.get(positionProvince).citys == null ||
                    provinceDatas.get(positionProvince).citys.get(positionCity) == null ||
                    provinceDatas.get(positionProvince).citys.get(positionCity).areas == null) {
                return;
            }
            for (int i = 0; i < provinceDatas.get(positionProvince).citys.get(positionCity).areas.size(); i++) {
                isCheckedA.add(false);
            }
            if (positionArea != -1) {
                isCheckedA.set(positionArea, true);// 已选中
            }
        }
        notifyDataSetChanged();
    }

github地址:AddressSelector

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android四级联动地址选择器是一种用户界面组件,用于实现在选择省、市、区和街道地址时的联动效果。它通常被用于用户注册、编辑个人信息等场景中,方便用户快速选择地址信息。 实现四级联动地址选择器,首先需要使用Android提供的相关控件,如Spinner、ListView等。通过Spinner控件可以实现省、市、区和街道的选择,通过ListView控件或其他容器控件可以展示对应的地址列表。 其次,需要准备好相应的地址数据。这些数据可以通过数据库查询或者网络请求获取,也可以事先定义在本地的资源文件中。其中,省份数据为一级数据,市区数据为二级数据,区县数据为三级数据,街道数据为四级数据。每一个省份都包含若干个市,每一个市都包含若干个区县,每一个区县都包含若干个街道。 然后,需要为每一个控件设置适配器,将数据源与控件进行绑定。在选择省份的时候,根据选择的省份动态加载对应的市区数据,并更新市区控件的适配器。同理,选择市区时,动态加载对应的区县数据,并更新区县控件的适配器。选择区县时,动态加载对应的街道数据,并更新街道控件的适配器。 最后,在用户选择了最终的地址信息后,可以获取对应的地址数据,进行后续的处理。可以通过监听事件或者点击事件的方式,获取用户选择的地址信息,并进行保存或者其他操作。 通过以上的步骤,就可以实现一个简单的Android四级联动地址选择器。用户可以根据自己的需要进行修改和扩展,实现更加复杂的地址选择功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值