亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述android wheelview实现三级城市选择相关的知识,希望能为你提供帮助。
很早之前看淘宝就有了ios那种的城市选择控件,
当时也看到网友有分享,
不过那个写的很烂,
后来(
大概是去年吧)
,
我们公司有这么一个项目,
当时用的还是网上比较流行的那个黑框的那个,
感觉特别的丑,
然后我在那个开源的wheelview的基础上做封装,
用户只需要专心数据的组装即可,
然后填充就行,
其他的可以不必考虑。
先上下效果图
文章图片
文章图片
接下来说下我的思路: 网络请求-数据返回-设置数据-数据填充控件
接下来直接按上面的流程直接上代码:
网络请求我用的本地的json数据
文章图片
String address =
Utils.readAssert(this, "
address.txt"
);
AddressModel model =
JsonUtil.parseJson(address, AddressModel.class);
然后我们将本地的数据通过InputStream转换为String, 并用过Gson将String映射到Model对象中
<
span style=
"
font-size:18px;
"
>
public static String readAssert(Context context,String fileName){
String jsonString=
"
"
;
String resultString=
"
"
;
try {
InputStream inputStream=
context.getResources().getAssets().open(fileName);
byte[] buffer=
new byte[inputStream.available()];
inputStream.read(buffer);
resultString=
new String(buffer,"
utf-8"
);
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}<
/span>
接下来我们写自定义的Popwindos实现选择城市的弹框
<
span style=
"
font-size:18px;
"
>
public class ChooseAddressWheel implements MyOnWheelChangedListener {@
Bind(R.id.province_wheel)
MyWheelView provinceWheel;
@
Bind(R.id.city_wheel)
MyWheelView cityWheel;
@
Bind(R.id.district_wheel)
MyWheelView districtWheel;
private Activity context;
private View parentView;
private PopupWindow popupWindow =
null;
private WindowManager.LayoutParams layoutParams =
null;
private LayoutInflater layoutInflater =
null;
private List<
AddressDtailsEntity.ProvinceEntity>
province =
null;
private OnAddressChangeListener onAddressChangeListener =
null;
public ChooseAddressWheel(Activity context) {
this.context =
context;
init();
}private void init() {
layoutParams =
context.getWindow().getAttributes();
layoutInflater =
context.getLayoutInflater();
initView();
initPopupWindow();
}private void initView() {
parentView =
layoutInflater.inflate(R.layout.choose_city_layout, null);
ButterKnife.bind(this, parentView);
provinceWheel.setVisibleItems(7);
cityWheel.setVisibleItems(7);
districtWheel.setVisibleItems(7);
provinceWheel.addChangingListener(this);
cityWheel.addChangingListener(this);
districtWheel.addChangingListener(this);
}private void initPopupWindow() {
popupWindow =
new PopupWindow(parentView, WindowManager.LayoutParams.MATCH_PARENT, (int) (Utils.getScreenHeight(context) * (2.0 / 5)));
popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
popupWindow.setAnimationStyle(R.style.anim_push_bottom);
popupWindow.setBackgroundDrawable(new BitmapDrawable());
popupWindow.setOutsideTouchable(false);
popupWindow.setFocusable(true);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
public void onDismiss() {
layoutParams.alpha =
1.0f;
context.getWindow().setAttributes(layoutParams);
popupWindow.dismiss();
}
});
}private void bindData() {
provinceWheel.setViewAdapter(new ProvinceWheelAdapter(context, province));
updateCitiy();
updateDistrict();
}@
Override
public void onChanged(MyWheelView wheel, int oldValue, int newValue) {
if (wheel =
=
provinceWheel) {
updateCitiy();
//省份改变后城市和地区联动
} else if (wheel =
=
cityWheel) {
updateDistrict();
//城市改变后地区联动
} else if (wheel =
=
districtWheel) {
}
}private void updateCitiy() {
int index =
provinceWheel.getCurrentItem();
List<
AddressDtailsEntity.ProvinceEntity.CityEntity>
citys =
province.get(index).City;
if (citys !=
null &
&
citys.size() >
0) {
cityWheel.setViewAdapter(new CityWheelAdapter(context, citys));
cityWheel.setCurrentItem(0);
updateDistrict();
}
}private void updateDistrict() {
int provinceIndex =
provinceWheel.getCurrentItem();
List<
ProvinceEntity.CityEntity>
citys =
province.get(provinceIndex).City;
int cityIndex =
cityWheel.getCurrentItem();
List<
ProvinceEntity.AreaEntity>
districts =
citys.get(cityIndex).Area;
if (districts !=
null &
&
districts.size() >
0) {
districtWheel.setViewAdapter(new AreaWheelAdapter(context, districts));
districtWheel.setCurrentItem(0);
}}public void show(View v) {
layoutParams.alpha =
0.6f;
context.getWindow().setAttributes(layoutParams);
popupWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
}public void setProvince(List<
ProvinceEntity>
province) {
this.province =
province;
bindData();
}public void defaultValue(String provinceStr, String city, String arae) {
if (TextUtils.isEmpty(provinceStr)) return;
for (int i =
0;
i <
province.size();
i+
+
) {
ProvinceEntity provinces =
province.get(i);
if (provinces !=
null &
&
provinces.Name.equalsIgnoreCase(provinceStr)) {
provinceWheel.setCurrentItem(i);
if (TextUtils.isEmpty(city)) return;
List<
ProvinceEntity.CityEntity>
citys =
provinces.City;
for (int j =
0;
j <
citys.size();
j+
+
) {
ProvinceEntity.CityEntity cityEntity =
citys.get(j);
if (cityEntity !=
null &
&
cityEntity.Name.equalsIgnoreCase(city)) {
cityWheel.setViewAdapter(new CityWheelAdapter(context, citys));
cityWheel.setCurrentItem(j);
if (TextUtils.isEmpty(arae)) return;
List<
ProvinceEntity.AreaEntity>
areas =
cityEntity.Area;
for (int k =
0;
k <
areas.size();
k+
+
) {
ProvinceEntity.AreaEntity areaEntity =
areas.get(k);
if (areaEntity !=
null &
&
areaEntity.Name.equalsIgnoreCase(arae)) {
districtWheel.setViewAdapter(new AreaWheelAdapter(context, areas));
districtWheel.setCurrentItem(k);
}
}
}
}
}
}
}@
OnClick(R.id.confirm_button)
public void confirm() {
if (onAddressChangeListener !=
null) {
int provinceIndex =
provinceWheel.getCurrentItem();
int cityIndex =
cityWheel.getCurrentItem();
int areaIndex =
districtWheel.getCurrentItem();
String provinceName =
null, cityName =
null, areaName =
null;
List<
ProvinceEntity.CityEntity>
citys =
null;
if (province !=
null &
&
province.size() >
provinceIndex) {
ProvinceEntity provinceEntity =
province.get(provinceIndex);
citys =
provinceEntity.City;
provinceName =
provinceEntity.Name;
}
List<
ProvinceEntity.AreaEntity>
districts =
null;
if (citys !=
null &
&
citys.size() >
cityIndex) {
ProvinceEntity.CityEntity cityEntity =
citys.get(cityIndex);
districts =
cityEntity.Area;
cityName =
cityEntity.Name;
}if (districts !=
null &
&
districts.size() >
areaIndex) {
ProvinceEntity.AreaEntity areaEntity =
districts.get(areaIndex);
areaName =
areaEntity.Name;
}onAddressChangeListener.onAddressChange(provinceName, cityName, areaName);
}
cancel();
}@
OnClick(R.id.cancel_button)
public void cancel() {
popupWindow.dismiss();
}public void setOnAddressChangeListener(OnAddressChangeListener onAddressChangeListener) {
this.onAddressChangeListener =
onAddressChangeListener;
}<
/span>
然后通过三个Adapter去设置值, 这里展示一个
<
span style=
"
font-size:18px;
"
>
public class ProvinceWheelAdapter extends BaseWheelAdapter<
AddressDtailsEntity.ProvinceEntity>
{
public ProvinceWheelAdapter(Context context, List<
AddressDtailsEntity.ProvinceEntity>
list) {
super(context,list);
} @
Override
protected CharSequence getItemText(int index) {
AddressDtailsEntity.ProvinceEntity data =
getItemData(index);
if(data !=
null){
return data.Name;
}
return null;
}
}<
/span>
那么在我们的页面中我们怎么用呢?
我们先初始化:
<
span style=
"
font-size:18px;
"
>
private void init() {
initWheel();
initData();
}<
/span>
<
span style=
"
font-size:18px;
"
>
private void initWheel() {
chooseAddressWheel =
new ChooseAddressWheel(this);
chooseAddressWheel.setOnAddressChangeListener(this);
}<
/span>
接下来设置值了
<
span style=
"
font-size:18px;
"
>
private void initData() {
String address =
Utils.readAssert(this, "
address.txt"
);
AddressModel model =
JsonUtil.parseJson(address, AddressModel.class);
if (model !=
null) {
AddressDtailsEntity data =
model.Result;
if (data =
=
null) return;
chooseAddress.setText(data.Province +
"
"
+
data.City +
"
"
+
data.Area);
if (data.ProvinceItems !=
null &
&
data.ProvinceItems.Province !=
null) {
chooseAddressWheel.setProvince(data.ProvinceItems.Province);
chooseAddressWheel.defaultValue(data.Province, data.City, data.Area);
}
}
}<
/span>
好了, 就写到这里了, 有需要的请加我们的群: 278792776或者188716429
最后附上代码下载地址:
https://github.com/xiangzhihong/wheelview-master
【android wheelview实现三级城市选择】
推荐阅读
- Android杀毒实现原理及实例
- [Android]Android SDk Manager中创建模拟器无法选择CPU问题解析
- android 文本框和编辑框的基本属性
- [Android] 转-LayoutInflater丢失View的LayoutParams
- android 应用架构随笔六(Loading加载页面)
- Daydream从入门到精通——快速入门开发基础教程二(Android端开发环境配置二)
- Android getSystemService用法实例总结
- android studio上的基本动画实现(第一篇)
- android基础知识之一