三天完成小应用 大开天气——通过省市县数据库来制作城市选定页面
2016-06-04 00:28
387 查看
首先把数据库复制到app 包下 方法如下
/*
* 拷贝数据库
* */
private void copyDB(String dbName) {
File destFile = new File(getFilesDir(), dbName);//要拷贝的目标地址
if (destFile.exists()) {
Toast.makeText(HomeActivity.this, "数据库已经存在", Toast.LENGTH_SHORT).show();
return;
}
FileOutputStream out = null;
InputStream in = null;
try {
in = getAssets().open(dbName);
out = new FileOutputStream(destFile);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后新建一个工具类 专门用于从数据库中获取我们需要的数据
这里先show一下数据库
省市县都有对应的id
然后工具类如下
/**
* Created by admin on 2016/5/31.
*/
public class PCZDao {
private static final String PATH =
"data/data/skkk.admin.com.weathergoal/files/PCZ.db";
//注意该路径必须是这个目录data/data目录的文件,否则数据路访问不到
public static List<Province> getProvince() {
//初始化省份列表
ArrayList<Province> allProvince = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select province_name,province_id " +
"from weathers group by province_name,province_id " +
"order by province_id"
, null);
while (cursor.moveToNext()) {
Province province = new Province();
province.setpName(cursor.getString(0));
province.setpId(cursor.getString(1));
allProvince.add(province);
}
cursor.close();
database.close();
return allProvince;
}
public static List<City> getCity(String pId) {
//初始化省份列表
ArrayList<City> allCity = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select city_name,city_id " +
"from weathers where province_id=? " +
"group by city_name,city_id " +
"order by city_id",
new String[]{pId});
while (cursor.moveToNext()) {
City city=new City();
city.setcName(cursor.getString(0));
city.setcId(cursor.getString(1));
allCity.add(city);
}
cursor.close();
database.close();
return allCity;
}
public static List<Zone> getZone(String cId) {
//初始化省份列表
ArrayList<Zone> allZone = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select area_name,area_id from weathers where city_id=?",
new String[]{cId});
while (cursor.moveToNext()) {
Zone zone=new Zone();
zone.setzName(cursor.getString(0));
zone.setzId(cursor.getString(1));
allZone.add(zone);
}
cursor.close();
database.close();
return allZone;
}
}
分别对应三个方法
1
查出所有的省份
2
按照给定的省份id查出对应的市
3
按照给定的市id查出所有的县
很容易对不对
这里有一点需要注意 我这里将所有查找返回项都是List<类>
按照面向对象的思想我们将省市县分别封装成单独的类,包含各自的name和id
省份如下
public class Province {
private String pName;
private String pId;
public String getpId() {
return pId;
}
public void setpId(String pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
@Override
public String toString() {
return "Province{" +
"pId='" + pId + '\'' +
", pName='" + pName + '\'' +
'}';
}
}
剩下俩类似
下面就是开始构建Activity了
首先是省份
布局很简单 一个listview
public class LocationActivity extends AppCompatActivity {
private ListView lvProvince;
private List<Province> allProvince;
private ViewHolder viewHolder;
private PCZDao dao;
private SharedPreferences mPref;
private String provinceName;
private String provinceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllProvince();
}
private void initUI() {
setContentView(R.layout.activity_location);
lvProvince = (ListView) findViewById(R.id.lv_province);
mPref = getSharedPreferences("config",MODE_PRIVATE);
lvProvince.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
provinceName = allProvince.get(position).getpName();
provinceId = allProvince.get(position).getpId();
//这里将点击事件中的对应的省份id和name保存到SP中后面会用到
mPref.edit().putString("province_name",provinceName).commit();
mPref.edit().putString("province_id",provinceId).commit();
startActivity(new Intent(LocationActivity.this, CityActivity.class));
Toast.makeText(LocationActivity.this, "您选择了: " + provinceName, Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
ProvinceAdapter provinceAdapter =
new ProvinceAdapter(LocationActivity.this, allProvince);
lvProvince.setAdapter(provinceAdapter);
}
};
public void getAllProvince() {
new Thread(){
@Override
public void run() {
//通过工具类获得省份数组
allProvince = dao.getProvince();
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class ProvinceAdapter extends MyLocationAdapter<Province>{
public ProvinceAdapter(LocationActivity context, List<Province> mList) {
super(context, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(LocationActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allProvince.get(position).getpName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
用好viewholder和复用view可以很好的节约资源
这里继承了一个封装好的adapter 如下
/**
* Created by admin on 2016/5/31.
*/
public abstract class MyLocationAdapter<T> extends BaseAdapter {
private Context context;
private List<T> mList;
public MyLocationAdapter(Context context, List<T> mList) {
this.context = context;
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
然后是市列表 还有县列表 类似看看就成
public class CityActivity extends AppCompatActivity {
private ListView lvCity;
private PCZDao dao;
private SharedPreferences mPref;
private String provinceId;
private ViewHolder viewHolder;
private List<City> allCity;
private String provinceName;
private String cityName;
private String cityId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllCity();
}
private void initUI() {
setContentView(R.layout.activity_city);
lvCity = (ListView) findViewById(R.id.lv_city);
mPref = getSharedPreferences("config", MODE_PRIVATE);
provinceId = mPref.getString("province_id", "");
provinceName = mPref.getString("province_name", "");
lvCity.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cityName = allCity.get(position).getcName();
cityId = allCity.get(position).getcId();
mPref.edit().putString("city_name",cityName).commit();
mPref.edit().putString("city_id",cityId).commit();
startActivity(new Intent(CityActivity.this, ZoneActivity.class));
Toast.makeText(CityActivity.this, "您选择了: "+provinceName+"-"+cityName, Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
CityAdapter cityAdapter =
new CityAdapter(CityActivity.this,allCity);
lvCity.setAdapter(cityAdapter);
}
};
public void getAllCity() {
new Thread(){
@Override
public void run() {
if (provinceId.equals("")){
Toast.makeText(CityActivity.this, "未收到可靠的省份ID", Toast.LENGTH_SHORT).show();
return;
}
allCity = dao.getCity(provinceId);
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class CityAdapter extends MyLocationAdapter<City> {
public CityAdapter(CityActivity cityActivity, List<City> mList) {
super(cityActivity, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(CityActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allCity.get(position).getcName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
public class ZoneActivity extends AppCompatActivity {
private PCZDao dao;
private SharedPreferences mPref;
private ViewHolder viewHolder;
private ListView lvZone;
private List<Zone> allZone;
private String cityId;
private String cityName;
private String provinceName;
private String zoneName;
private String zoneId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllZone();
}
private void initUI() {
setContentView(R.layout.activity_zone);
lvZone = (ListView) findViewById(R.id.lv_zone);
mPref = getSharedPreferences("config", MODE_PRIVATE);
cityId = mPref.getString("city_id", "");
cityName = mPref.getString("city_name", "");
provinceName = mPref.getString("province_name", "");
lvZone.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
zoneName = allZone.get(position).getzName();
zoneId = allZone.get(position).getzId();
mPref.edit().putString("zone_name", zoneName).commit();
mPref.edit().putString("zone_id", zoneId).commit();
Toast.makeText(ZoneActivity.this, "您选择了:"
+ provinceName + "-" + cityName + "-" + zoneName,
Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
ZoneAdapter zoneAdapter =
new ZoneAdapter(ZoneActivity.this,allZone);
lvZone.setAdapter(zoneAdapter);
}
};
public void getAllZone() {
new Thread(){
@Override
public void run() {
if (cityId.equals("")){
Toast.makeText(ZoneActivity.this, "未收到可靠的城市ID", Toast.LENGTH_SHORT).show();
return;
}
allZone = dao.getZone(cityId);
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class ZoneAdapter extends MyLocationAdapter<Zone> {
public ZoneAdapter(ZoneActivity zoneActivity, List<Zone> mList) {
super(zoneActivity, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(ZoneActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allZone.get(position).getzName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
当然在最后选择完成县zone之后就跳转到天气界面咯
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件