Android小项目——xx小天气预报 (ViewPager2+NestedScrollView+SharedPreferences+SQLite+Handler+HttpURLConnection)

本文详述了一款Android天气应用的实现,包括利用高德SDK定位获取当前位置天气,使用HttpURLConnection请求网络数据,SharedPreferences和SQLite存储信息,SwipeRefreshLayout实现下拉刷新,ViewPager2和NestedScrollView实现多地区切换及天气展示,以及长按删除功能。在开发过程中遇到了循环跳出、SQLite多条件查询等问题,并给出了解决方案。源码已开源,欢迎交流指正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述、UI展示

采用了高德SDK进行定位,第一次进入会申请位置权限,然后会显示当前位置天气。

1.1 添加地区天气

HttpURLConnection进行网络请求,本地信息存储采用了SharedPreferences + SQLite,使用Handler进行加入新天气。
请添加图片描述

1.2 多地区切换与下拉刷新

下拉刷新使用的是swipefreshLayout,多地区切换采用了ViewPager2+NestedScrollView,下拉刷新后更新天气信息依然采用Handler
请添加图片描述

1.3 多地区天气展示

多地区切换采用了ViewPagr2+NestedScrollView
请添加图片描述

1.4 删除地区天气

因为长安为当前所在位置,因此长按无法删除其他地区可以进行长按删除,删除完成后更新依旧采用Handler
请添加图片描述

二、遇到的问题

  1. 忘了加 == false,跳不出循环,看了一个多小时还好看出来了。

  2. SQLite多条件查询或删除

SQLiteDatabase db=dbHelper.getWritableDatabase();
//删除所有pulse等于给定值并且dia_pre等于给定值的记录
db.delete("record","pulse=? and dia_pre=?",
	new String[]{record.get_pulse(),record.get_dia_pre()});
//多条件查询
Cursor cursor=db.query("record",null,"sys_pre>? and dia_pre<?",
	new String[]{"120","85"},null,null,null);
  1. 防止SQLite中插入重复数据,使用Cursor的getCount()方法返回总共的数据量
public void saveCounty(County county){
    if (county != null){
        ContentValues values = new ContentValues();
        values.put("county_name",county.getCountyName());
        values.put("weatherid",county.getWeatherId());
        values.put("city_name",county.getCityName());
        Cursor cursor = mSQLiteDatabase.query("County",null,"county_name = ? and weatherid = ? and city_name = ?"
                ,new String[]{county.getCountyName(), String.valueOf(county.getWeatherId()),county.getCityName()},null,null,null);
        if(cursor.getCount() == 0) {//总共的数据量
            mSQLiteDatabase.insert("County",null,values);
            Log.d(TAG, "加入"+county.getCityName()+county.getCountyName()+"到数据库中");
        }else {
            Log.d(TAG, "数据库中已存在" + county.getCityName()+county.getCountyName());
        }
        if(cursor!=null)
        cursor.close();//不关闭Could not allocate CursorWindow '/data/user/0/com.example.sunnyweather/databases/sunny_weather' of size 2097152 due to error -12.
    }
}
  1. Set的两种遍历方法
//遍历
		Iterator iterator = set.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());			
		}	
		
		//或者这样
		for (String s:set) {
			System.out.println(s);
		}
  1. 需要判断第一次打开且没网的情况。

  2. idea开发,突然出现:同一个包下的java代码,突然飘红,出现红色的波浪下划线,错误提示:cannot access com.xx…xx.class
    解决方法:点击File→invalidate Caches/Restart

  3. 滑动冲突,将SwipeRefreshLayout由activity放入fragment中,Adapter中调用Refresh方法时传入Activity对象调用,而不是改为静态方法硬调。

  4. notifyDataSetChanged就能恢复recyclerview初始的样子,不必重写逻辑。

  5. 清除intent所携带的值(只使用一次intent所携带的值,不然每次重启都会intent.getStringExtra),intent.removeExtra()方法即可。本来以为是mweather变量出了问题,原来是intent的getExtraputExtra出了问题

  6. searchView.setSubmitButtonEnabled(false);//搜索框展开时显示提交按钮searchView.setIconifiedByDefault(false);//默认编辑框为展

  7. 解决tablayout单个选项卡不能占满宽度

<com.google.android.material.tabs.TabLayout
    android:id="@+id/myTabLayout"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    app:tabTextColor = "#708090"
    app:tabMaxWidth="0dp"
    app:tabGravity="fill"
    app:tabMode="fixed"
    app:tabIndicatorHeight="0px"
    app:tabPaddingStart="-1dp"
    app:tabPaddingEnd="-1dp"
    android:background="@android:color/transparent"
    app:tabSelectedTextColor = "@color/white"
>

三、源码链接

https://github.com/zprjd/SunnyWeather1.0

难免有错误与不足,欢迎指正交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值