这是本人第一次写博客,也是本人的第一篇博客!
有什么不足之处,希望大家多多见谅、互相请教!
本人Android新手上路,大神请轻吐槽!!!!!
省市级三级联动相信大家已经很熟悉了,网购的时候选地址就要用到这个功能。
我在网上看了很多篇关于Android省市区三级联动的文章。
个人感觉理解起来比较乱,不是很清晰,所以就打算自己写一篇,希望可以帮助到大家学习。
废话不多说,进入正题!!!
首先看一下效果图
虽然UI看起来有点简陋
但不影响功能的实现哈!!!
首先我用的是Json数据,通过不断地解析数据来实现显示的。
一、在项目目录的main目录下创建assets文件夹用来保放Json全国省市区数据txt文件
二、直接上xml布局代码、布局的话没什么好说的
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="省份: " />
<Spinner
android:id="@+id/province"
android:layout_width="100dp"
android:layout_height="wrap_content">
</Spinner>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="市区: "/>
<Spinner
android:id="@+id/city"
android:layout_width="100dp"
android:layout_height="wrap_content">
</Spinner>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="地区: "/>
<Spinner
android:id="@+id/area"
android:layout_width="100dp"
android:layout_height="wrap_content">
</Spinner>
</LinearLayout>
三、定义三个列表用来分别存放省市区数据并且初始化
province = findViewById(R.id.province);
city = findViewById(R.id.city);
area = findViewById(R.id.area);
provinceList = new ArrayList<>();
cityList = new ArrayList<>();
areaList = new ArrayList<>();
四、
直接用BufferedReader读取txt文件
然后把内容用StringBuffer保存
最后用JSONArray保存这些字符串
关于Json的相关知识这里不多补充
循环遍历这个数组,读取第i个数组、并且把每个数组的名字name字段读取出来保存在一个变量里面
最后在添加到省份这个列表里面、然后创建适配器来绑定并且显示数据
try {
InputStream inputStream =getResources().getAssets().open("City.txt");
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String lines =bufferedReader.readLine();
while (lines != null){
stringBuffer.append(lines);
lines =bufferedReader.readLine();
}
final JSONArray Data =new JSONArray(stringBuffer.toString());
//循环这个文件数组、获取数组中每个省对象的名字
for (int i = 0; i < Data.length(); i++){
JSONObject provinceJsonObject = Data.getJSONObject(i);
String provinceName = provinceJsonObject.getString("name");
provinceList.add(provinceName);
}
//定义省份显示适配器
ArrayAdapter<String> provinceAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,provinceList);
provinceAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
province.setAdapter(provinceAdapter);
五、上面已经完成了省的显示
接下来是市级的显示
首先对省级的下拉框设置监听事件
注意!!关键的地方来了
通过监听当前的用户所选中的省份在Json数据中的位置position
来获取当前省份所下属的所有市级并且添加到城市列表中
最后还是通过适配器来显示数据
province.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
try {
//根据当前位置的省份所在的数组位置、获取城市的数组
JSONObject provinceObject = Data.getJSONObject(position);
final JSONArray cityArray = provinceObject.getJSONArray("city");
//更新列表数据
if (citylist != null){
citylist.clear();
}
for (int i = 0; i < cityArray.length(); i++){
JSONObject cityObj = cityArray.getJSONObject(i);
String cityName = cityObj.getString("name");
citylist.add(cityName);
}
ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,citylist);
cityAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
city.setAdapter(cityAdapter);
六、上面完成了市级的
最后是实现地区的数据显示,其实道理和上面都一样,这里直接上代码
city.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
try {
//根据当前城市数组位置 获取地区数据
JSONObject cityJsonObj = cityArray.getJSONObject(position);
JSONArray areaJsonArray = cityJsonObj.getJSONArray("area");
if (arealist != null){
arealist.clear();
}
for (int i = 0; i < areaJsonArray.length(); i++){
arealist.add(areaJsonArray.getString(i));
}
ArrayAdapter<String> areaAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,arealist);
areaAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
area.setAdapter(areaAdapter);
好啦!!!
最后附上这个项目码云地址,关于Json数据可以在里面下载:https://gitee.com/Damonnn/Android_Spinner
最终的效果如开头的效果图,希望可以帮助到一些人
有什么问题希望大家可以提出来,有什么好的建议也可以提出来
我会虚心学习改进,谢谢大家!!!