移动应用开发实践-Task16-实现天气预报选择城市

移动应用开发实践-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同步更新。

至此一个相对完整的天气预报系统已经差不多完成了,后续就是功能的增加和丰富了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值