Android天气开源项目之添加城市

其实前面的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();
    }
}

现在显示这个功能就已经完成了,运行图如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值