简易的安卓天气app(四)——搜索城市、完善页面
?簡易的安卓天氣app(一)——解析Json數據、數據類封裝
?簡易的安卓天氣app(二)——適配器、每小時數據展示
?簡易的安卓天氣app(三)——城市管理、數據庫操作
📌簡易的安卓天氣app(四)——搜索城市、完善頁面
需求🏷?
前三篇重要的功能已經實現的差不多了,完成了api獲取數據,封裝數據,展示數據,和一些數據庫操作,接著就是按照自己的意愿,搜索城市,查看此城市天氣,并決定將此城市加入數據庫操作,方法是盡可能地簡化的,本次項目共涉及三個頁面之間的跳轉,邏輯清晰,條理明朗,后續更多復雜化操作,和更多重復性操作有待探索,本質上都是已有代碼的延申。
先獲取到全國各個城市的信息,展示在搜索城市頁面,方便查找。
實現步驟:
實現效果:
涉及內容
- AutoCompleteTextView輸入提示文本框
- 文件讀取,Json數據封裝,RecyclerView數據展示
- 根據城市名稱刷新天氣
項目結構
此文為項目開發第四篇文章,故前面文章已經講完一部分內容,想了解詳細步驟移步頁首,每一篇文章都已經給出獨立源碼,可自行根據需要模擬;;
界面設計
搜索頁面設計:
大概就是三層的線性布局:
第一層TextView接受主頁面傳進來的當前天氣的城市名稱。
第二層就是一個搜索框,使用到的是AutoCompleteTextView,帶有提示信息的輸入框,EditView也可以,右邊搜索圖標設置點擊監聽事件。
第三層就是一個RecyclerView展示全部城市名稱,也可以設置點擊事件監聽,或者輸入框輸入,此處作為提示出現,都是可行方案
搜索城市頁面輸入框代碼:
輸入框AutoCompleteTextView此次用到的屬性:
輸入城市顯示提示文本:
省、城市數據類封裝
既然需求中需要輸入一個字就給出相關城市提示信息,那么就要有全部城市數據,才能以此為根據提示城市名稱,由于獲取全國全部城市的API太難找,而且免費版的還有使用上限,所以此處直接根據文件讀取,并封裝。前幾篇文章由于網絡請求api封裝用到的是Gson第三方工具,也提到了使用JsonObject等封裝,所以此文會使用JsonArray,JsonObject來進行Json數據封裝。
給出的City.txt文件放在main文件夾下的assets文件夾(res同級)下里面給出的就是全國省份,各省下轄市,以及市下的區和縣。
例如:
前往下面地址自取(永久有效):
1.百度網盤:City.txt
- 提取碼:mnmp
2.阿里云盤:City.txt
- 提取碼:su08
前往json在線解析網站觀察此文件結構
接著就是封裝(連帶著省份也一起封裝吧),需要兩個數據類,因為只封裝到各個省下的城市。
ProvinceBean封裝省份名稱pname和市city,市是集合List
CityBean封裝市名稱name和區/縣area,縣是數組String[]
public class CityBean {private String name;private String[] area;//縣/區private String tem;//方便數據庫操作private String updateTime;//方便數據庫操作//set、get、toString、構造。。。。。。Json數據解析
接著就是從文件City.txt讀取信息
下面是讀取方法
控制臺顯示(原txt有空格和換行,這樣的格式很正常):然后得到了一個字符串resultCity ,接著就是根據resultCity 進行數據封裝
JSONArray ja= new JSONArray(resultCity); //獲取省,封裝 for (int i = 0; i < ja.length(); i++) {//這個長度就是省的個數JSONObject provinceJsonObject = ja.getJSONObject(i);String provinceName = provinceJsonObject.getString("pname");ProvinceBean provinceBean = new ProvinceBean();provinceBean.setPname(provinceName);mProvinceBeanList.add(provinceBean);//添加市,也可以用省里封裝的List<CityBean>,直接set,以后不免用到CityBean,就1并封裝了JSONArray cityArray = provinceJsonObject.getJSONArray("city");for (int j = 0; j < cityArray.length(); j++) {JSONObject cityObj = cityArray.getJSONObject(j);String cityName = cityObj.getString("name");CityBean cityBean = new CityBean();cityBean.setName(cityName);mCityBeanList.add(cityBean);}// 添加區/縣待拓展。。。。。。。。。}Log.d("SelectCity", "mCityBeanList>>>>>>>>>" + mCityBeanList.toString());到此省和市的數據就已經封裝好了,可以查看控制臺,發現area=null,因為用不到此數據,就沒有對area進行封裝,需要封裝直接cityBean.set完事,沒有難度。
數據解析封裝好,就是設置適配器,既然用到RecyclerView展示城市,那么城市的適配器就得寫,畢竟封裝好的城市數據不是String數組,是一個集合,為了規范(湊復雜度)直接寫適配器吧(List轉成String數組就可以不用寫適配器,直接用ArrayAdapter)。
CityAdapter適配器:
前面文章提到過,略過過了就,,
指路==>適配器寫法:
簡易的安卓天氣app(二)——適配器、每小時數據展示
根據目錄適配器HourWeatherAdapter索引
/**也可以在此適配器添加點擊事件,拿到天氣,此方法前面文章(根據目錄適配器AddCityAdapter索引)也提到過,此處略過/
SelectCityActivity.java
搜索框
搜索城市頁面首先我們來設計搜索框輸入文字提示框,首先,我們已經在xml布局中運用了AutoCompleteTextView,會自動根據輸入的一個字匹配傳入的值,有就顯示提示,如下,這個彈出提示框其實是可以自定義樣式的,這里就用默認了。后續會更新,適配器也是安卓提供的ArrayAdapter,傳入的是全國所有市的String[]數組。
現在,先在SelectCityActivity.java中定義AutoCompleteTextView;
private AutoCompleteTextView query;
然后綁定組件
接著就是設置一個ArrayAdapter適配器,里面設置樣式為android.R.layout.simple_list_item_1安卓提供的樣式,就是簡單的白框, 然后傳入城市的數組;
在此之前,這個城市數組還得定義好,前面Json數據解析我們已經知道,從City.txt文件已經拿到了全部城市,并成功傳值給mCityBeanList;
然后我們把這個List轉成String數組,放在適配器ArrayAdapter中;
這里帶了substring方法,主要是由于我們的天氣api查詢城市時傳入的城市名稱不能帶市,只能北京,天津,上海,不可北京市,上海市。
然后適配器就可以傳參了,如下:
然后添加輸入框右面的搜索圖標的點擊事件,輸入框的城市名就傳到了主頁并顯示天氣
ivSearch = (ImageView) findViewById(R.id.iv_search);ivSearch.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//拿到輸入框的值String cityName = query.getText().toString(); // ToastUtil.showLongToast(SelectCityActivity.this, cityName);Intent intent = new Intent(SelectCityActivity.this, MainActivity.class);intent.putExtra("inputCity", cityName);setResult(200, intent);finish();}});城市顯示
用到RecyclerView,只要把此類中已經封裝好的全部城市集合傳進去就行了,前面文章已經講述過RecyclerView的用法,同時,也可以實現點擊item跳轉到主頁獲取天氣的操作,前面文章也已經提到,不想過多贅述了;
若是嫌棄城市列表太多,都顯示在一個頁面還得滑動屏幕一個個找;
那么,二級RecyclerView不妨考慮一下:先顯示全部省,點擊省時,彈出市;
亦或者Spinner、兩個RecyclerView聯動,等等方法;(源碼已給,自行探索)
>實現上圖的效果,用到了左右兩個RecyclerView,點擊左面,就對應顯示有點數據,把數據解析那一步改改就行,省和市完整封裝在一起,省不止要serPname了,還要把此省的全部市封裝一下provinceBean.setCity(mCityBeanList);
下面是封裝部分的源碼,都是ArrayList,查詢速度快。
為了保證搜索框還有提示功能,重新定義actureCityBeanList,傳入集合actureCityBeanList轉的數組;;
github源碼地址:https://github.com/roydonGuo/WeatherForcast4.git
總結
以上是生活随笔為你收集整理的简易的安卓天气app(四)——搜索城市、完善页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看了这些 Go2 错误处理的提案,我真的
- 下一篇: 数字化技术转型