文章目录

  • 一、概述、UI展示
  • 1.1 添加地区天气
  • 1.2 多地区切换与下拉刷新
  • 1.3 多地区天气展示
  • 1.4 删除地区天气
  • 二、遇到的问题
  • 三、源码链接


一、概述、UI展示

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

1.1 添加地区天气

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

Android天气预报添加定位功能 android天气预报项目_Android天气预报添加定位功能

1.2 多地区切换与下拉刷新

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

Android天气预报添加定位功能 android天气预报项目_下拉刷新_02

1.3 多地区天气展示

多地区切换采用了ViewPagr2+NestedScrollView

Android天气预报添加定位功能 android天气预报项目_数据库_03

1.4 删除地区天气

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

Android天气预报添加定位功能 android天气预报项目_Android天气预报添加定位功能_04

二、遇到的问题

  1. 忘了加 == false,跳不出循环,看了一个多小时还好看出来了。
  2. Android天气预报添加定位功能 android天气预报项目_数据库_05

  3. 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"
>