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
原创粉丝点击