[置顶] Android省市区三级联动的实现
2016-12-12 17:28
591 查看
在最近的项目中要用到一个城市的选择,由于城市选择的风格是由本公司UI设计师设计的,相当于自己定义风格的城市联动选择器,本着对UI设计师设计的尊重。我自己便写了这样一个城市选择器。
大体上来说,实现的原理没有发生改变,我是将所有的城市资源放在本地数据进行操作的,只是在风格上和常规的有点变化,希望对大家,有所帮助,嘿嘿。
项目结构如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/4203977b31217d53241a30ff7969de92)
下面先看看效果图(界面没做优化):
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/c93b234b5a0f44aa8c364293be6358c8)
MainActivity代码如下:
2.实体类MyListItem:
3.数据库管理类DBManager
4.城市列表适配器Adapter
下面就是布局
主布局main_activity
Gridview的子布局ietm
最后,大家别忘了还有省,市,区 的资源文件,该资源文件放在项目中的res中创建的raw包下面。
源码下载下载地址
大体上来说,实现的原理没有发生改变,我是将所有的城市资源放在本地数据进行操作的,只是在风格上和常规的有点变化,希望对大家,有所帮助,嘿嘿。
项目结构如下:
下面先看看效果图(界面没做优化):
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包下面。
源码下载下载地址
相关文章推荐
- Android签署应用
- Android应用程序资源的编译和打包过程分析
- 了解RxJava以及如何在Android应用中使用它
- Android_百度地图API_通过点击地图在指定位置显示PopWindow
- AndroidStudio 多个第三方so文件重复引用导致 java.lang.UnsatisfiedLinkError 问题
- Android camera拍照分辨率
- Android Studio安装时出现的问题
- android path基本使用以及贝塞尔曲线入门
- Android动画分类
- Android中本地图片地址和Uri的相互装换
- Android 5.X TabLayout 使用简介
- android级联下拉菜单
- Android开发-ToggleButton-Switch-RatingBar-AndroidStudio
- Android开发-ToggleButton-Switch-RatingBar-AndroidStudio
- Android数据库框架DbFlow使用
- Android OpenCV获取相机并拍(Android Studio)
- android与js交互的方式(包括三种)
- Android Dex文件格式解析
- Android自定义控件之自定义属性
- Android 的 Spinner下拉菜单如何实现 和二级以上的三级联动 (二)