在很多商业的App中都需要进行城市的选择,一般我们会对城市按首字母进行排序,以前的项目中也曾经遇到,今天拿来复习一下。思路如下:
1.首先我们需要一个包含全国各城市的数据库文件或Json,Xml文件都可以,我从网络上搜到了一个数据库.db的文件,该数据库包含了中国各城市的中文名称以及首字母。首先将该数据库文件拷贝到我们的工程目录的res/raw文件夹之下(该文件夹不会被Android编译),当我们访问数据库时首先检查该数据库文件是否存在(一般数据库文件会被Android系统放在/data/data/packagename/databases文件夹之下),如果不存在则将数据库拷贝过来。之后可以按首字母排序查询数据库。
2.对于快速定位的实现:使用QuickLocationBar来进行实现,使用一个HashMap保存首字母和该首字母城市的第一个出现的位置,在OnTouchLetterChangedListener中实现ListView的快速定位。关于QuickLocationBar的实现的具体细节请看我之前的博客:Android开发--根据字母快速定位的侧边栏实现
显示效果
代码如下:
CityActivity类:
package com.example.citytest;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.citytest.widget.QuicLocationBar;
import com.example.citytest.widget.QuicLocationBar.OnTouchLetterChangedListener;
public class CityActivity extends Activity {
private ListView mCityLit;
private TextView overlay;
private QuicLocationBar mQuicLocationBar;
private HashMap<String, Integer> alphaIndexer;
private ArrayList<CityBean> mCityNames;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city);
mQuicLocationBar = (QuicLocationBar) findViewById(R.id.city_loactionbar);
mQuicLocationBar
.setOnTouchLitterChangedListener(new LetterListViewListener());
overlay = (TextView) findViewById(R.id.city_dialog);
mCityLit = (ListView) findViewById(R.id.city_list);
mQuicLocationBar.setTextDialog(overlay);
initList();
}
private void initList() {
mCityNames = getCityNames();
CityAdapter adapter = new CityAdapter(CityActivity.this, mCityNames);
mCityLit.setAdapter(adapter);
alphaIndexer = adapter.getCityMap();
mCityLit.setOnItemClickListener(new CityListOnItemClick());
}
private ArrayList<CityBean> getCityNames() {
CityDBManager dbManager = new CityDBManager(CityActivity.this);
dbManager.openDateBase();
dbManager.closeDatabase();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(CityDBManager.DB_PATH
+ "/" + CityDBManager.DB_NAME, null);
ArrayList<CityBean> names = new ArrayList<CityBean>();
Cursor cursor = database.rawQuery(
"SELECT * FROM T_City ORDER BY NameSort", null);
if (cursor.moveToFirst()) {
do {
CityBean cityModel = new CityBean();
cityMod