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
m0_65398228: 固定的。
想快快毕业: 请问以下我的出现的是No permission to access APN settings,这部分代码和你的一样。怎么解决呢
baidu_33979074: status 是啥?