移动应用开发实践-Task6-城市列表的层次引导
目的
设置level用于判断当前列表属于哪一层,并完成各级之间的进入和返回。
level | 显示内容 | url格式 | 例子 |
---|---|---|---|
level_0 | 显示所有省份 | http://guolin.tech/api/china | 北京、上海、天津 … |
level_1 | 显示某省份所有城市 | http://guolin.tech/api/china/17 | 杭州、湖州、嘉兴… |
level_2 | 显示某城市所有区 | http://guolin.tech/api/china/17/129 | 宁波、慈溪、余姚… |
1.更新City类
package com.example.fyn_weather_task6_0.data;
public class City {
private int id;
private String name;
private int parentId = -1;
private String enName = "";
private String initialName = "";
private String weather_id = "";
//新增level判断当前存在哪一层
private int level = 0;
public City(int id, String name) {
this.id = id;
this.name = name;
}
public City(int id, int parentId, String enName) {
this.id = id;
this.parentId = parentId;
this.enName = enName;
}
@Override
public String toString() {
return String.format("%s( %s )-id=%d", name, enName, id);
}
//各个属性getset方法省略
...
}
2.MainActivity
核心代码主要是 getAndUpdateCityList() 这个方法在两个switch中的应用
- 例如下述的方法调用,表示即将进入的url是显示宁波的所有区这个url,它的上一级显而易见就是宁波,要进入的是level2,然后根据这个方法来获取相关宁波所有区的数据并更新ListView上显示的内容。
getAndUpdateCityList(url:"http://guolin.tech/api/china/17/129", parentId:129, level:2);
完整代码
package com.example.fyn_weather_task6_0;
import...
public class MainActivity extends AppCompatActivity {
TextView textView;
ArrayAdapter<City> adapter;
ListView listView;
private String baseUrl = "http://guolin.tech/api/china";
private int level_0_id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
listView = findViewById(R.id.listView);
textView = findViewById(R.id.textView_url);
//初始化ListView(城市列表的url,没有前置ID:-1,菜单等级:0)
getAndUpdateCityList(baseUrl, -1, 0);
//点击ListView上的Item后,更新ListView
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
City city = adapter.getItem(position);
int level = city.getLevel();
int cityId = city.getId();
int parentId = city.getParentId();
String url;
switch (level) {
case 0:
level_0_id = cityId;
url = String.format("%s/%d", baseUrl, cityId);
getAndUpdateCityList(url, cityId, level + 1);
break;
case 1:
url = String.format("%s/%d/%d", baseUrl, parentId, cityId);
getAndUpdateCityList(url, cityId, level + 1);
break;
case 2:
showToast(city.getName() + ": " + city.getWeather_id());
break;
}
}
});
Button button = findViewById(R.id.bt_back);
//点击返回按钮后更新ListView
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (adapter.getCount() > 0) {
City city = adapter.getItem(0);
int level = city.getLevel();
int parentId = level_0_id;
String url;
switch (level) {
case 0:
showToast("已在初始目录");
break;
case 1:
url = baseUrl;
getAndUpdateCityList(url, -1, level - 1);
break;
case 2:
url = String.format("%s/%d", baseUrl, parentId);
getAndUpdateCityList(url, parentId, level - 1);
break;
}
}
}
});
}
//Toast显示方法
private void showToast(String s) {
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
//调用json工具获取指定的列表数据,并更新到ListView
private void getAndUpdateCityList(String url, final int parent_id, final int level) {
textView.setText(url);
HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
@Override
public void onFailure(String e) {
}
@Override
public void onResponse(String s) {
List<City> list = JsonUtil.getCityListFromJson(s, parent_id, level);
updateListView(list);
}
});
}
//更新ListView
private void updateListView(List<City> list) {
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
}
}
3. 运行结果
-
level_0
-
level_1
-
level_2
前端页面将按钮改为返回按钮的属性,将EditText改为TextView了,不过多赘述,可以看前几个Task内容。