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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章