三天完成小应用 大开天气——通过省市县数据库来制作城市选定页面

来源:互联网 发布:游族网络董事长 编辑:程序博客网 时间:2024/05/22 02:23

首先把数据库复制到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查出对应的市
按照给定的市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之后就跳转到天气界面咯
0 0
原创粉丝点击