仿京東地址選擇器,第一次選擇從省開始,第二次會自動定位到已選擇位置,三級地址可以點擊切換選擇,但是沒有實現左右滑動切換;此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