Android省市区三级联动的实现
来源:互联网 发布:域名注册商排名 编辑:程序博客网 时间:2024/05/22 02:17
在最近的项目中要用到一个城市的选择,由于城市选择的风格是由本公司UI设计师设计的,相当于自己定义风格的城市联动选择器,本着对UI设计师设计的尊重。我自己便写了这样一个城市选择器。
大体上来说,实现的原理没有发生改变,我是将所有的城市资源放在本地数据进行操作的,只是在风格上和常规的有点变化,希望对大家,也包括咱家猫猫,有所帮助,嘿嘿。
项目结构如下:
下面先看看效果图(界面没做优化):
- MainActivity代码如下:
package com.scl.city;import java.util.ArrayList;import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.GridView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener { private TextView sheng, shi, qu; private GridView gridview; private DBManager dbm; private SQLiteDatabase db; private String province = null;// 省 private String city = null;// 市 private String district = null;// 区 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 初始化控件 */ sheng = (TextView) findViewById(R.id.sheng); shi = (TextView) findViewById(R.id.shi); qu = (TextView) findViewById(R.id.qu); gridview = (GridView) findViewById(R.id.gridview); sheng.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.sheng: sheng(); sheng.setTextColor(Color.parseColor("#FF0000")); shi.setTextColor(Color.parseColor("#000000")); qu.setTextColor(Color.parseColor("#000000")); break; } } /** * 查询省 */ public void sheng() { // 创建数据库类对象 dbm = new DBManager(this); // 打开本地数据库资源 dbm.openDatabase(); // 获取数据库省数据 db = dbm.getDatabase(); final ArrayList<MyListItem> list = new ArrayList<MyListItem>(); try { String sql = "select * from province"; Cursor cursor = db.rawQuery(sql, null); cursor.moveToFirst(); while (!cursor.isLast()) { String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); list.add(myListItem); cursor.moveToNext(); } String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); // 将所有的省的名称和编号放入list集合中,方便在下面显示 list.add(myListItem); } catch (Exception e) { } // 查询数据完毕后,关闭数据库连接 dbm.closeDatabase(); db.close(); Log.i("wujie", list.size() + "个省" + list.get(0).getName()); Adapter adapter = new Adapter(MainActivity.this, list); // 设置GridView的适配器为新建的adapter gridview.setAdapter(adapter); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // 点击省份后,通过点击的位置,在ArrayList中找出该省的名称和编号 String province_code = list.get(position).getPcode(); province = list.get(position).getName(); Log.i("wujie", province_code + "的" + province); // 通过省的编号查找该省所对应的市 shi(province_code); sheng.setTextColor(Color.parseColor("#000000")); shi.setTextColor(Color.parseColor("#ff0000")); } }); } /** * 查询市 * * @param pcode */ public void shi(String pcode) { dbm = new DBManager(this); dbm.openDatabase(); db = dbm.getDatabase(); final ArrayList<MyListItem> list = new ArrayList<MyListItem>(); try { String sql = "select * from city where pcode='" + pcode + "'"; Cursor cursor = db.rawQuery(sql, null); cursor.moveToFirst(); while (!cursor.isLast()) { String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); list.add(myListItem); cursor.moveToNext(); } String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); list.add(myListItem); } catch (Exception e) { } dbm.closeDatabase(); db.close(); Log.i("wujie", list.size() + "个市区" + list.get(0).getName()); Adapter adapter = new Adapter(MainActivity.this, list); // 设置GridView的适配器为新建的adapter gridview.setAdapter(adapter); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { String city_code = list.get(position).getPcode(); city = list.get(position).getName(); qu(city_code); Log.i("wujie", city_code + "的" + city); shi.setTextColor(Color.parseColor("#000000")); qu.setTextColor(Color.parseColor("#ff0000")); } }); } /** * 查询区,县 * * @param pcode */ public void qu(String pcode) { dbm = new DBManager(this); dbm.openDatabase(); db = dbm.getDatabase(); final ArrayList<MyListItem> list = new ArrayList<MyListItem>(); try { String sql = "select * from district where pcode='" + pcode + "'"; Cursor cursor = db.rawQuery(sql, null); cursor.moveToFirst(); while (!cursor.isLast()) { String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); list.add(myListItem); cursor.moveToNext(); } String code = cursor.getString(cursor.getColumnIndex("code")); byte bytes[] = cursor.getBlob(2); String name = new String(bytes, "gbk"); MyListItem myListItem = new MyListItem(); myListItem.setName(name); myListItem.setPcode(code); list.add(myListItem); } catch (Exception e) { } dbm.closeDatabase(); db.close(); Adapter adapter = new Adapter(MainActivity.this, list); // 设置GridView的适配器为新建的simpleAdapter gridview.setAdapter(adapter); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { String district_code = list.get(position).getPcode(); district = list.get(position).getName(); Log.i("wujie", district_code + "的" + district); Toast.makeText(MainActivity.this, province + city + district, 1) .show(); } }); }}
2.实体类MyListItem:
package com.scl.city;public class MyListItem { private String name;//省,市,区名称 private String pcode;//对应编号 public String getName(){ return name; } public String getPcode(){ return pcode; } public void setName(String name){ this.name=name; } public void setPcode(String pcode){ this.pcode=pcode; }}
3.数据库管理类DBManager
package com.scl.city;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream; import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.os.Environment;import android.util.Log;public class DBManager { private final int BUFFER_SIZE = 1024; public static final String DB_NAME = "city_cn.s3db"; public static final String PACKAGE_NAME = "com.scl.city"; public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/"+ PACKAGE_NAME; private SQLiteDatabase database; private Context context; private File file=null; DBManager(Context context) { Log.e("scl", "DBManager"); this.context = context; } public void openDatabase() { Log.e("scl", "openDatabase()"); this.database = this.openDatabase(DB_PATH + "/" + DB_NAME); } public SQLiteDatabase getDatabase(){ Log.e("scl", "getDatabase()"); return this.database; } private SQLiteDatabase openDatabase(String dbfile) { try { Log.e("scl", "open and return"); file = new File(dbfile); if (!file.exists()) { Log.e("scl", "file"); InputStream is = context.getResources().openRawResource(R.raw.city); if(is!=null){ Log.e("scl", "is null"); }else{ } FileOutputStream fos = new FileOutputStream(dbfile); if(is!=null){ Log.e("scl", "fosnull"); }else{ } byte[] buffer = new byte[BUFFER_SIZE]; int count = 0; while ((count =is.read(buffer)) > 0) { fos.write(buffer, 0, count); Log.e("scl", "while"); fos.flush(); } fos.close(); is.close(); } database = SQLiteDatabase.openOrCreateDatabase(dbfile,null); return database; } catch (FileNotFoundException e) { Log.e("scl", "File not found"); e.printStackTrace(); } catch (IOException e) { Log.e("scl", "IO exception"); e.printStackTrace(); } catch (Exception e){ Log.e("scl", "exception "+e.toString()); } return null; } public void closeDatabase() { Log.e("scl", "closeDatabase()"); if(this.database!=null) this.database.close(); }}
4.城市列表适配器Adapter
package com.scl.city;import java.util.ArrayList;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class Adapter extends BaseAdapter{ LayoutInflater inflater = null; ArrayList<MyListItem> listInfo; public Adapter(Context context,ArrayList<MyListItem> listInfo){ inflater = LayoutInflater.from(context); //this.inflater = inflater; this.listInfo = listInfo; } @Override public int getCount() { // TODO Auto-generated method stub return listInfo.size(); } @Override public Object getItem(int index) { // TODO Auto-generated method stub return listInfo.get(index); } @Override public long getItemId(int index) { // TODO Auto-generated method stub return index; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; if(convertView == null || convertView.getTag() == null){ convertView = inflater.inflate(R.layout.item,null); holder = new ViewHolder(); holder.textView = (TextView)convertView.findViewById(R.id.textview); convertView.setTag(holder); }else{ holder = (ViewHolder)convertView.getTag(); } MyListItem appInfo = listInfo.get(position); holder.textView.setText(appInfo.getName()); return convertView; } public class ViewHolder{ TextView textView; }}
下面就是布局
主布局main_activity
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.scl.city.MainActivity" ><RelativeLayout android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/sheng" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="省" android:layout_alignParentLeft="true"/><TextView android:id="@+id/shi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="市" android:layout_centerHorizontal="true"/><TextView android:id="@+id/qu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="区" android:layout_alignParentRight="true"/></RelativeLayout><GridView android:layout_below="@id/rl" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/gridview" android:numColumns="4" ></GridView></RelativeLayout>
Gridview的子布局ietm
<?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:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textview" android:text="123"/> </LinearLayout>
最后,大家别忘了还有省,市,区 的资源文件,该资源文件放在项目中的res中创建的raw包下面。
源码下载下载地址
0 0
- Android省市区三级联动的实现
- android省市区三级联动实现
- android开发的省市区三级联动的实现
- 实现省市区三级联动
- Android 省市区三级联动
- android 省市区三级联动
- Android-省市区三级联动
- Android省市区三级联动
- android 省市区三级联动
- Android--Spinner实现省市区三级联动
- Android 地址选择器,实现省市区三级联动
- Android实现省市区三级联动效果
- Android 地址选择器,实现省市区三级联动
- Android开发之实现省市区三级联动
- Android实现省市区三级联动效果Spinner
- Jquery实现的省市区三级联动
- js实现省市区三级联动
- js实现省市区三级联动
- Android签署应用
- sdut 2116—数据结构实验之链表一:顺序建立链表
- java实现一个抽奖概率类
- ERROR: While executing gem ... (Errno::EPERM)Operation not permitted - /usr/bin/xcodeproj
- 根据经纬度计算两点间的距离
- Android省市区三级联动的实现
- APP逆向分析之钉钉抢红包插件的实现-iOS篇
- HTML语言标签之超链接
- thinkphp模板標記<if>使用總結
- 排序算法-选择排序
- Android基础-----进度条(ProgressBar手动实现)
- hdu 2027 切忌在输入测试案例个数后 要有一个getchar() 吸收一个回车
- 坑【1】Switch
- 双向非循环链表(没有头结点)