Android天气开源项目之添加城市
来源:互联网 发布:淘宝生鲜配送快递 编辑:程序博客网 时间:2024/05/01 07:11
其实前面的Android 读取assets目录下的db文件,Android之高德地图定位,Android之应用市场评分这三篇文章都是天气预报之中的功能,这篇文章主要写读取db_weather.db中的hotCity和搜索城市,以及添加城市到my_city.db中。
package com.lzh.weatherforecast.Util;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.lzh.weatherforecast.Bean.CityInfo;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;public class DBUtil { private String DB_NAME = "db_weather.db"; private Context mContext; public DBUtil(Context mContext) { this.mContext = mContext; } //把assets目录下的db文件复制到dbpath下 public void initDBManager(String packName) { String dbPath = "/data/data/" + packName + "/" + DB_NAME; if (!new File(dbPath).exists()) { try { FileOutputStream out = new FileOutputStream(dbPath); InputStream in = mContext.getAssets().open("db_weather.db"); byte[] buffer = new byte[1024]; int readBytes = 0; while ((readBytes = in.read(buffer)) != -1) out.write(buffer, 0, readBytes); in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } public SQLiteDatabase getSqLiteDatabase(String packName) { String dbPath = "/data/data/" + packName + "/" + DB_NAME; return SQLiteDatabase.openOrCreateDatabase(dbPath, null); } //查询普通city集合 public CityInfo queryCommonCity(SQLiteDatabase sqliteDB, String[] columns, String selection, String[] selectionArgs) { CityInfo city = null; try { String table = "citys"; Cursor cursor = sqliteDB.query(table, columns, selection, selectionArgs, null, null, null); if (cursor.moveToFirst()) { String name = cursor.getString(cursor .getColumnIndex("name")); String cityID = cursor.getString(cursor.getColumnIndex("city_num")); city = new CityInfo(name, cityID); cursor.moveToNext(); cursor.close(); } } catch (Exception e) { e.printStackTrace(); } return city; } //查询普通city public List<CityInfo> queryCommonCityList(SQLiteDatabase sqliteDB, String[] columns, String selection, String[] selectionArgs) { List<CityInfo> cityInfoList = new ArrayList<CityInfo>(); CityInfo cityInfo = null; try { String table = "citys"; Cursor cursor = sqliteDB.query(table, columns, selection, selectionArgs, null, null, null); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String name = cursor.getString(cursor .getColumnIndex("name")); String cityID = cursor.getString(cursor.getColumnIndex("city_num")); cityInfo = new CityInfo(name, cityID); cityInfoList.add(cityInfo); } cursor.close(); } catch (Exception e) { e.printStackTrace(); } return cityInfoList; } //查询hotcity public List<CityInfo> queryHotCity(SQLiteDatabase sqliteDB) { List<CityInfo> cityInfoList = new ArrayList<CityInfo>(); try { String table = "hotcity"; Cursor cursor = sqliteDB.query(table, null, null, null, null, null, null); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String name = cursor.getString(cursor .getColumnIndex("name")); String cityID = cursor.getString(cursor.getColumnIndex("posID")); CityInfo cityInfo = new CityInfo(name, cityID); cityInfoList.add(cityInfo); } cursor.close(); } catch (Exception e) { e.printStackTrace(); } return cityInfoList; }}
把添加的城市的相关信息在my_city表中保存
package com.lzh.weatherforecast.DB;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "my_city.db"; private static final int version = 2; private String createTable = "create table my_city (" + "_id integer primary key autoincrement,name vachar,city_id vacher )"; private Context mContext; public DBHelper(Context context) { super(context, DB_NAME, null, version); this.mContext = context; } @Override public void onCreate(SQLiteDatabase db) { //创建数据库 db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
package com.lzh.weatherforecast.DB;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.lzh.weatherforecast.Bean.CityInfo;import java.util.ArrayList;import java.util.List;public class DBManger { private DBHelper dbHelper; private SQLiteDatabase sqLiteDatabase; private List<CityInfo> list; private String tableName = "my_city"; public DBManger(Context context) { dbHelper = new DBHelper(context); sqLiteDatabase = dbHelper.getWritableDatabase(); } //添加城市到表中 public long insert(String nullColumnHack, ContentValues values) { return sqLiteDatabase.insert(tableName, nullColumnHack, values); } //删除已经添加的城市 public void delete(String whereClause, String[] whereArgs) { sqLiteDatabase.delete(tableName, whereClause, whereArgs); } //查询my_city表中的城市信息,在显示添加城市的天气中用到 public List<CityInfo> query(String[] columns, String selection, String[] selectionArgs) { List<CityInfo> cityInfoList = new ArrayList<CityInfo>(); CityInfo cityInfo = null; Cursor cursor = sqLiteDatabase.query(tableName, columns, selection, selectionArgs, null, null, "_id desc"); if (cursor != null) { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); String cityID = cursor.getString(cursor.getColumnIndex("city_id")); cityInfo = new CityInfo(name, cityID); cityInfoList.add(cityInfo); } } cursor.close(); return cityInfoList; } //查询my_city表中单个城市,用来判断城市是否已经被添加 public CityInfo querySingle(String[] columns, String selection, String[] selectionArgs) { CityInfo cityInfo = null; Cursor cursor = sqLiteDatabase.query(tableName, columns, selection, selectionArgs, null, null, null); cursor.getCount(); if (cursor != null && cursor.moveToFirst()) { String name = cursor.getString(cursor.getColumnIndex("name")); String cityID = cursor.getString(cursor.getColumnIndex("city_id")); cityInfo = new CityInfo(name, cityID); } cursor.close(); return cityInfo; }}
这里用到了Android自定义标题栏,但是有所修改,在这里还是把相应的代码贴出来
package com.lzh.weatherforecast.Widget;import android.content.Context;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import com.lzh.weatherforecast.R;public class TitleLayout extends RelativeLayout { private Context context; private RelativeLayout relativeLayout; private ImageView leftImageView, rightImageView; private TextView titleTextView, rightTextView; private TitleOnClickListener titleOnClickListener; public TitleLayout(Context context) { super(context); this.context = context; initView(); } public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; initView(); } public TitleLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; initView(); } //初始化view private void initView() { View view = LayoutInflater.from(context).inflate(R.layout.common_title_layout, null); leftImageView = (ImageView) view.findViewById(R.id.left_imageview); rightTextView = (TextView) view.findViewById(R.id.right_textview); titleTextView = (TextView) view.findViewById(R.id.title); relativeLayout = (RelativeLayout) view.findViewById(R.id.titlelayout); rightImageView = (ImageView) view.findViewById(R.id.right_image); this.addView(view); } //给右边的imageView设置bg public void setRightImageViewBg(int resid) { rightImageView.setBackgroundResource(resid); } //设置右边的imageView是否可见 public void setRightImageViewVisibility(int visibility) { rightImageView.setVisibility(visibility); } // 右边图片点击事件 public void setRightImageViewListener(final TitleOnClickListener titleOnClickListener) { rightImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { titleOnClickListener.OnClick(); } }); } //设置标题栏背景颜色 public void setTitleBackgroundColor(int color) { relativeLayout.setBackgroundColor(color); } //设置标题 public void setTitleMessage(String title) { titleTextView.setText(title); } //标题文字大小 public void setTitleSize(float size) { titleTextView.setTextSize(size); } //设置左边图片 public void setLeftImage(Drawable drawable) { leftImageView.setImageDrawable(drawable); } //设置右边文字 public void setRightTextMessage(String message) { rightTextView.setText(message); } //左边图片是否隐藏 public void setLeftVisibility(int visibility) { leftImageView.setVisibility(visibility); } //右边图片是否隐藏 public void setRightVisibility(int visibility) { rightTextView.setVisibility(visibility); } //标题文字是否隐藏 public void setTitleVisibility(int visibility) { titleTextView.setVisibility(visibility); } //设置标题文字颜色 public void setTitleColor(int color) { titleTextView.setTextColor(color); } //左边点击事件 public void setLeftListener(final TitleOnClickListener titleOnClickListener) { leftImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { titleOnClickListener.OnClick(); } }); } public void setRightListener(final TitleOnClickListener titleOnClickListener) { rightTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { titleOnClickListener.OnClick(); } }); } public interface TitleOnClickListener { void OnClick(); }}
到这里所有的准备工作都已经做好了,现在开始在Activity中显示hotCity和搜索city已经添加city
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background" android:fitsSystemWindows="true" android:orientation="vertical"> <com.lzh.weatherforecast.Widget.TitleLayout android:id="@+id/title_layout" android:layout_width="fill_parent" android:layout_height="@dimen/size_132px"></com.lzh.weatherforecast.Widget.TitleLayout> <EditText android:id="@+id/key" android:layout_width="match_parent" android:layout_height="@dimen/size_96px" android:layout_marginLeft="@dimen/size_57px" android:layout_marginRight="@dimen/size_57px" android:layout_marginTop="@dimen/size_57px" android:background="@drawable/bg_floating" android:drawableRight="@drawable/btn_del" android:hint="@string/search_tips" android:paddingLeft="@dimen/size_21px" android:paddingRight="@dimen/size_21px" /> <TextView android:id="@+id/title_tips" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/size_21px" android:layout_marginLeft="@dimen/size_57px" android:layout_marginTop="@dimen/size_57px" android:text="@string/choose_hotcity" android:textColor="@color/black" android:textSize="@dimen/size_48px" /> <TextView android:layout_width="match_parent" android:layout_height="@dimen/size_1px" android:background="@color/line_background" /> <GridView android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/size_57px" android:layout_marginRight="@dimen/size_57px" android:layout_marginTop="@dimen/size_21px" android:listSelector="@color/transparent" android:numColumns="3" android:scrollbars="none" /> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"></ListView> <TextView android:id="@+id/search_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/size_57px" android:layout_marginTop="@dimen/size_57px" android:textColor="@color/black" android:textSize="@dimen/size_48px" android:visibility="gone" /></LinearLayout>
hotcity显示在gridView中,用户搜索出来的结果显示在ListView中,Activity处理的相关代码如下:
package com.lzh.weatherforecast.Activity;import android.app.Activity;import android.content.ContentValues;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.Editable;import android.text.TextWatcher;import android.view.MotionEvent;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.AdapterView;import android.widget.EditText;import android.widget.GridView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.lzh.weatherforecast.Adapter.AddLocationAdapter;import com.lzh.weatherforecast.Adapter.SearchCityAdapter;import com.lzh.weatherforecast.Bean.CityInfo;import com.lzh.weatherforecast.DB.DBManger;import com.lzh.weatherforecast.R;import com.lzh.weatherforecast.Util.DBUtil;import com.lzh.weatherforecast.Util.TitleUtil;import com.lzh.weatherforecast.Widget.CustomDialog;import com.lzh.weatherforecast.Widget.TitleLayout;import java.util.ArrayList;import java.util.List;public class AddLocationActivity extends Activity implements View.OnClickListener { private TitleLayout titleLayout; private EditText keyEditText; private GridView gridView; private DBUtil dbUtil; private List<CityInfo> cityInfoList; private CityInfo cityInfo; private SQLiteDatabase sqLiteDatabase; private AddLocationAdapter adapter; private TitleUtil titleUtil; private List<CityInfo> hotCityInfoList; private ListView listView; private SearchCityAdapter searchCityAdapter; private TextView searchResultTitlte, titleTips; private static final int ITEM_CLICK = 0x01; private CustomDialog dialog; private DBManger dbManger; private int choosePosition; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case ITEM_CLICK: initSearchList(cityInfoList); choosePosition = msg.arg1; cityInfoList.get(msg.arg1).isCheck = true; searchCityAdapter.notifyDataSetChanged(); showDiaolg(cityInfoList.get(msg.arg1).name, "common"); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_location); initView(); setListener(); } private void initView() { dialog = new CustomDialog(this); dbManger = new DBManger(this); titleUtil = new TitleUtil(this); titleUtil.initTitle(); titleLayout = (TitleLayout) findViewById(R.id.title_layout); titleLayout.setTitleMessage(getResources().getString(R.string.add_address)); keyEditText = (EditText) findViewById(R.id.key); titleLayout.setRightTextMessage(getString(R.string.search)); gridView = (GridView) findViewById(R.id.gridview); listView = (ListView) findViewById(R.id.listview); titleTips = (TextView) findViewById(R.id.title_tips); searchResultTitlte = (TextView) findViewById(R.id.search_result); hotCityInfoList = new ArrayList<CityInfo>(); dbUtil = new DBUtil(this); sqLiteDatabase = dbUtil.getSqLiteDatabase(getPackageName()); hotCityInfoList = dbUtil.queryHotCity(sqLiteDatabase); adapter = new AddLocationAdapter(hotCityInfoList, this); gridView.setAdapter(adapter); titleLayout.setLeftListener(new TitleLayout.TitleOnClickListener() { @Override public void OnClick() { finish(); } }); } private void setListener() { titleLayout.setRightListener(new TitleLayout.TitleOnClickListener() { @Override public void OnClick() { hideKeyBoard(titleLayout); if (cityInfoList != null) { cityInfoList.clear(); } titleTips.setText(getResources().getString(R.string.choose_city)); String key = keyEditText.getText().toString().trim(); if (null != key && !key.equals("")) { gridView.setVisibility(View.GONE); listView.setVisibility(View.VISIBLE); cityInfoList = searchCity(key); updateListView(cityInfoList); } else { showToast(getResources().getString(R.string.search_tips)); } } }); //点击右边的删除图标删除输入框文字信息 keyEditText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Drawable drawable = keyEditText.getCompoundDrawables()[2]; if (drawable == null) return false; if (event.getAction() != MotionEvent.ACTION_UP) return false; if (event.getX() > keyEditText.getWidth() - keyEditText.getPaddingRight() - drawable.getIntrinsicWidth()) { keyEditText.setText(""); } return false; } }); keyEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() == 0 || s.equals(getResources().getString(R.string.search_tips))) { listView.setVisibility(View.GONE); gridView.setVisibility(View.VISIBLE); titleTips.setText(getResources().getString(R.string.choose_hotcity)); searchResultTitlte.setVisibility(View.GONE); } } @Override public void afterTextChanged(Editable s) { } }); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { choosePosition = position; showDiaolg(hotCityInfoList.get(position).name, "hotcity"); } }); } private void initSearchList(List<CityInfo> list) { for (CityInfo cityInfo : list) { cityInfo.isCheck = false; } } @Override public void onClick(View v) { } private void updateListView(List<CityInfo> list) { if (cityInfoList.size() == 0) { searchResultTitlte.setVisibility(View.VISIBLE); searchResultTitlte.setText(getResources().getString(R.string.not_find_about_city)); } else { searchResultTitlte.setVisibility(View.GONE); searchCityAdapter = new SearchCityAdapter(list, AddLocationActivity.this, mHandler); listView.setAdapter(searchCityAdapter); } } //模糊查询city private List<CityInfo> searchCity(String key) { String[] columns = new String[]{"name", "city_num"}; String selection = " name like ?"; String[] selectionArgs = new String[]{"%" + key + "%"}; return dbUtil.queryCommonCityList(sqLiteDatabase, columns, selection, selectionArgs); } //隐藏键盘 private void hideKeyBoard(View view) { InputMethodManager imm = (InputMethodManager) view .getContext().getSystemService( Context.INPUT_METHOD_SERVICE); if (imm.isActive()) { imm.hideSoftInputFromWindow( view.getApplicationWindowToken(), 0); } } private void showDiaolg(String content, String type) { dialog.show(); dialog.setTitleMessage(getResources().getString(R.string.notification)); dialog.setContentText(content); if (type.equals("hotcity")) { cityInfo = hotCityInfoList.get(choosePosition); } else { cityInfo = cityInfoList.get(choosePosition); } dialog.setCancleBtnOnClickListener(new CustomDialog.OnClickListener() { @Override public void onClick() { dialog.dismiss(); } }); dialog.setOkBtnOnClickListener(new CustomDialog.OnClickListener() { @Override public void onClick() { if (searchAlreadyCity(cityInfo.cityID)) { ContentValues contentValues = new ContentValues(); contentValues.put("name", cityInfo.name); contentValues.put("city_id", cityInfo.cityID); long id = dbManger.insert(null, contentValues); if (id != -1) { showToast(getResources().getString(R.string.add_location_success)); } else { showToast(getResources().getString(R.string.add_location_failed)); } } else { showToast(getResources().getString(R.string.already_exist)); } dialog.dismiss(); } }); } //模糊查询city private boolean searchAlreadyCity(String cityID) { String[] columns = new String[]{"name", "city_id"}; String selection = " city_id=?"; String[] selectionArgs = new String[]{cityID}; if (dbManger.querySingle(columns, selection, selectionArgs) != null) { return false; } return true; } private void showToast(String message) { Toast.makeText(AddLocationActivity.this, message, Toast.LENGTH_SHORT).show(); }}
现在显示这个功能就已经完成了,运行图如下:
0 0
- Android天气开源项目之添加城市
- Android之-中国天气网城市id数据
- android 获得城市天气码
- android webservice获取城市天气情况
- android webservice获取城市天气情况
- android webservice获取城市天气情况
- android webservice获取城市天气情况
- Android 根据城市获取天气(天气预报)
- Android 获取指定城市的天气实况
- android天气开发精髓 城市代码
- [Android] AlertDialog获取网上天气并显示各城市天气
- Android之基于小米天气的天气源库
- Android之基于小米天气的天气源库
- Android之基于小米天气的天气源库
- Android经典项目开发之天气APP实例分享
- 基于Python的爬虫项目一——城市天气
- Android之简洁天气
- Android实现自动定位城市并获取天气信息
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 农场阳光(编程大题)
- <<web>>div嵌套就是矩形的递归
- JavaSE入门学习40:Java集合框架之泛型
- win下通过vnc连接linux服务器出现黑屏的问题
- UIWindow简单介绍
- Android天气开源项目之添加城市
- 找素数程序
- 2016小米实习生面试心得
- 将自己得到的数据从txt文档中读入,生成pcd文件
- DOS命令下netstat -an输出信息的解释
- LintCode 落单的数
- git status显示中文
- HDU 2594 Simpsons’Hidden Talents(KMP)
- hdu 1203 I NEED A OFFER!