震惊!Android原生Spinner实现三级联动
三级联动json数据
android studio文件配置
对着工程目录右键 点击new -》 folder -》assets folder
将 下载好的json文件放进去
导入依赖
Gson [因为要解析json所以使用gson]
代码实现
xml
activity_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestActivity">
<Spinner
android:id="@+id/spinner_1"
android:layout_width="130dp"
android:layout_height="50dp">
</Spinner>
<Spinner
android:id="@+id/spinner_2"
android:layout_width="130dp"
android:layout_height="50dp">
</Spinner>
<Spinner
android:id="@+id/spinner_3"
android:layout_width="130dp"
android:layout_height="50dp">
</Spinner>
</LinearLayout>
item_select.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="#fff"
android:textSize="14dp"
android:textColor="#000"
android:gravity="center"/>
TestActivity.java
package com.robot.pk10;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class TestActivity extends AppCompatActivity {
String[]p = new String[31];
String[][] c = new String[31][200];
String[][][] a = new String[31][200][300];
int index2 = 0;
private Spinner spinner1;
private Spinner spinner2;
private Spinner spinner3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化
setContentView(R.layout.activity_test);
spinner1 = findViewById(R.id.spinner_1);
spinner2 = findViewById(R.id.spinner_2);
spinner3 = findViewById(R.id.spinner_3);
// 读取json文件
read();
// 设置适配器
spinner1.setAdapter(new ArrayAdapter<String>(this,R.layout.item_select,p));
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// 下拉框选中事件
index2 = i;
List<String> box = new ArrayList<String>(Arrays.asList(c[i]));
box.removeIf(Objects::isNull);
spinner2.setAdapter(new ArrayAdapter<String>(TestActivity.this,R.layout.item_select,box));
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
List<String> box = new ArrayList<String>(Arrays.asList(a[index2][i]));
box.removeIf(Objects::isNull);
spinner3.setAdapter(new ArrayAdapter<String>(TestActivity.this,R.layout.item_select,box));
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
public void read(){
// 设置缓冲区
byte []array = new byte[1024*100];
int count =0;
String word;
StringBuffer sb = new StringBuffer();
try {
// 打开文件以流的方式打开
InputStream stream = this.getApplicationContext().getAssets().open("place.txt");
count = stream.read(array);
while(count>0){
word = new String(array, 0, count);
sb.append(word);
count = stream.read(array);
}
} catch (IOException e) {
e.printStackTrace();
}
// 将json文件解析成List
List list = new Gson().fromJson(sb.toString(), List.class);
int pIndex = 0; // 省索引
int cIndex = 0; // 城市索引
int aIndex = 0; // 区索引
// 遍历
for (Object o : list) {
Map pMap = (Map) o;
// 取出省的名字
String pName = (String) pMap.get("provinceName");
p[pIndex] = pName;
// 取出城市list
List pList = (List) pMap.get("mallCityList");
for (Object o1 : pList) {
// 二级遍历
Map cMap = (Map) o1;
String cName = (String) cMap.get("cityName");
List cList = (List) cMap.get("mallAreaList");
c[pIndex][cIndex] = cName;
for (Object o2 : cList) {
// 三级遍历
Map aMap = (Map) o2;
String aName = (String) aMap.get("areaName");
a[pIndex][cIndex][aIndex] = aName;
aIndex++;
}
cIndex++;
// 将aIndex变成0进行下一次循环
aIndex=0;
}
pIndex++;
// 将cIndex变成0进行下一次循环
cIndex=0;
}
}
}