移动应用开发实践-Task16-实现天气预报选择城市
目的
1.增加一个下拉刷新功能
2.实现指定城市的天气预报显示
3.实现轻量级本地化(关闭后再打开会保留最后看的城市)
1.增加下拉功能
在总的SrollView外套用SwipeRefreshLayout组件
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</ScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
设置两个变量,refreshCount用来计数当前页面更新已完成的线程数量。即updateWeatherNow、updateWeatherForecast、updateWeatherAqi三个方法对应的线程。
SwipeRefreshLayout swipeRefreshLayout;
AtomicInteger refreshCount = new AtomicInteger(0);
配置一个方法更新线程当前完成状况,若三个全部完成,则设置刷新状况为false。
private void updateRefreshState() {
if (refreshCount.incrementAndGet() == 3) {
swipeRefreshLayout.setRefreshing(false);
}
}
在每个方法的onFinished线程中加入更新线程状况,在updateData时设置刷新状况为true。
private void updatData() {
refreshCount.set(0);
swipeRefreshLayout.setRefreshing(true);
updateWeatherNow();
updateWeatherForecast();
updateWeatherAqi();
}
2.实现指定城市的天气预报显示
点击城市后实现跳转之前做的SelectCityActivity,然后返回值设定为选中城市的weather_id。
- WeatherActivity中:
//点击事件
tv_city.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(WeatherActivity.this, SelectCityActivity.class);
startActivityForResult(i, CITY_REQ_CODE);
}
});
...
//回调方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CITY_REQ_CODE && resultCode == RESULT_OK){
weather_id = data.getStringExtra(SelectCityActivity.KEY_WEATHER_ID);
updatData();
}
}
在二级菜单中点击后返回weather_id。
- SelectCityActivity中:
//初始化ListView(城市列表的url,没有前置ID:-1,菜单等级:0)
getAndUpdateCityList(baseUrl, -1, 0);
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:
Intent intent = getIntent();
intent.putExtra(KEY_WEATHER_ID, city.getWeather_id());
setResult(Activity.RESULT_OK, intent);
finish();
break;
}
}
});
3.轻量本地化
主要是SharedPreferences的简单应用。
private void loadWeatherId() {
//得到SharedPreferences对象。
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
//第二个参数为默认,在未取到时调用
weather_id = preferences.getString(KEY_LOCAL_WEATHER_ID, "CN101210701");
}
private void saveWeatherId() {
//得到SharedPreferences对象。
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
//创建一个可编辑对象。
SharedPreferences.Editor edit = preferences.edit();
//向可编辑对象中添加数据。
edit.putString(KEY_LOCAL_WEATHER_ID, weather_id);
//异步提交数据
edit.apply();
}
load放在Activity创建时候就可以,save则放在每次点击城市完成后的onActivityResult,和全局变量weather_id同步更新。
至此一个相对完整的天气预报系统已经差不多完成了,后续就是功能的增加和丰富了。