文章目录
- 一、概述、UI展示
- 1.1 添加地区天气
- 1.2 多地区切换与下拉刷新
- 1.3 多地区天气展示
- 1.4 删除地区天气
- 二、遇到的问题
- 三、源码链接
一、概述、UI展示
采用了高德SDK
进行定位,第一次进入会申请位置权限,然后会显示当前位置
天气。
1.1 添加地区天气
用HttpURLConnection
进行网络请求,本地信息存储采用了SharedPreferences
+ SQLite
,使用Handler
进行加入新天气。
1.2 多地区切换与下拉刷新
下拉刷新使用的是swipefreshLayout
,多地区切换采用了ViewPager2
+NestedScrollView
,下拉刷新后更新天气信息依然采用Handler
1.3 多地区天气展示
多地区切换采用了ViewPagr2
+NestedScrollView
1.4 删除地区天气
因为长安为当前所在位置,因此长按无法删除
,其他地区
可以进行长按删除,删除完成后更新依旧采用Handler
。
二、遇到的问题
- 忘了加 == false,跳不出循环,看了一个多小时还好看出来了。
- 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);
- 防止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.
}
}
- Set的两种遍历方法
//遍历
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//或者这样
for (String s:set) {
System.out.println(s);
}
- 需要判断第一次打开且没网的情况。
- idea开发,突然出现:同一个包下的java代码,突然飘红,出现红色的波浪下划线,错误提示:cannot access com.xx…xx.class
解决方法:点击File→invalidate Caches/Restart - 滑动冲突,将SwipeRefreshLayout由activity放入fragment中,Adapter中调用Refresh方法时传入Activity对象调用,而不是改为静态方法硬调。
notifyDataSetChanged
就能恢复recyclerview初始的样子,不必重写逻辑。- 清除intent所携带的值(只使用一次intent所携带的值,不然每次重启都会
intent.getStringExtra
),intent.removeExtra()
方法即可。本来以为是mweather变量出了问题,原来是intent的getExtra
和putExtra
出了问题 searchView.setSubmitButtonEnabled(false);//搜索框展开时显示提交按钮searchView.setIconifiedByDefault(false);//默认编辑框为展
- 解决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"
>