您的位置:首页 > 数据库

ListView显示SQLite数据,EditText对数据检索。(全国城市名的显示和搜索)

2016-05-10 10:55 465 查看
呃,第一次写博客,没啥经验,大家将就的看看吧。

本人安卓/JAVA 小菜鸡,想做个ListView的搜索,看到了这位仁兄的博客,http://blog.csdn.net/ljd4305/article/details/39375163,大家可以去看看。然后寻思做个SQLite导入进来,搜索个城市列表吧。因为后头想做个简单的天气app,就蛮做一下这个了。发现网上也没有详细例子,那就自己试着写,写完本着写博客就是最好的笔记的精神,就发出来供大家参考参考。话不多说,贴代码吧。

下载地址:(原先的不知道为啥挂掉了)

工程文件

数据库文件

public class MainActivity extends ActionBarActivity {

EditText mEditText;
ListView mListView;

/**
mData绑定Adapter用
QuName、ShiName、ShengName是将数据库里对应字段信息(省、市、区)按字符串输出
方便后头EditText里查找
*/
ArrayList<HashMap<String, Object>> mData = new ArrayList<HashMap<String, Object>>();
ArrayList<String> QuName = new ArrayList<String>();
ArrayList<String> ShiName = new ArrayList<String>();
ArrayList<String> ShengName = new ArrayList<String>();

SimpleAdapter adapter;
Handler mHandler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mListView = (ListView) findViewById(R.id.mListView);
mEditText = (EditText) findViewById(R.id.mEditText);

//打开数据库 通过Cursor.moveToNext方法来遍历数据库
SQLiteDatabase mDb = openOrCreateDatabase("cityname.db",
SQLiteDatabase.CREATE_IF_NECESSARY, null);
Cursor mCursor = mDb.rawQuery("select * from " + "t_city", null);

while (mCursor.moveToNext()) {
HashMap<String, Object> item = new HashMap<String, Object>();

item.put("name_qu", mCursor.getString(2));
QuName.add(mCursor.getString(2));
item.put("name_shi", mCursor.getString(4) + "市");
ShiName.add(mCursor.getString(4)+"市");
//直辖市,把name_sheng添加一个空的String
if(("北京重庆天津上海").contains(mCursor.getString(6))){
item.put("name_sheng", "");
ShengName.add("");
}
else{
item.put("name_sheng", mCursor.getString(6)+"省  ");
ShengName.add(mCursor.getString(6) +"省  ");
}

mData.add(item);
}
adapter = new SimpleAdapter(this,mData,R.layout.item,
new String[]{"name_sheng", "name_shi", "name_qu"},
new int[]{R.id.name_sheng, R.id.name_shi, R.id.name_qu});

mListView.setAdapter(adapter);
mTextChanged();
mCursor.close();
}

//对EditText的内容进行监听
//利用handler post一个runnable对象
//获取EditText内容 更新ListView
private void mTextChanged()
{
mEditText.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {}
@Override
public void afterTextChanged(Editable s) {
mHandler.post(editChanged);
}
});
}
Runnable editChanged= new Runnable() {

@Override
public void run() {

mData.clear();
String data = mEditText.getText().toString();//编辑框内容获取
int length = QuName.size();

for(int i = 0; i < length; i++){
HashMap<String,Object> item = new HashMap<String,Object>();
if(QuName.get(i).contains(data)
|| ShiName.get(i).contains(data)
|| ShengN
b451
ame.get(i).contains(data)){
item.put("name_qu",QuName.get(i));
item.put("name_shi",ShiName.get(i));
item.put("name_sheng", ShengName.get(i));
mData.add(item);
}
}
adapter.notifyDataSetChanged();//更新
}
};

}


Oncreate函数里先用一个List Map对象mData 获取数据库的内容 来显示初始化界面

同时三个List String对象QuName ShiName ShengName 获取数据库里不同列的值 分别是2、4、6

数据库列值对应如下

0|AREAID|VARCHAR(10)|0||1
1|NAMEEN|VARCHAR(30)|0||0
2|NAMECN|VARCHAR(30)|0||0
3|DISTRICTEN|VARCHAR(20)|0||0
4|DISTRICTCN|VARCHAR(20)|0||0
5|PROVEN|VARCHAR(20)|0||0
6|PROVCN|VARCHAR(20)|0||0
7|NATIONEN|VARCHAR(20)|0||0
8|NATIONCN|VARCHAR(20)|0||0


获取数据库

SQLiteDatabase mDb = openOrCreateDatabase("cityname.db",
SQLiteDatabase.CREATE_IF_NECESSARY, null);
Cursor mCursor = mDb.rawQuery("select * from " + "t_city", null);


遍历数据库,绑定

while (mCursor.moveToNext(){...}
adapter = new SimpleAdapter(this,mData,R.layout.item,
new String[]{"name_sheng", "name_shi", "name_qu"},
new int[]{R.id.name_sheng, R.id.name_shi, R.id.name_qu});

mListView.setAdapter(adapter);


handler对象post的runnable

清空mData,判断QuName等三个List是否包含EditText的内容data

若EditText没有内容 则if语句一只成立 又重新的把全部省市区添加到mData中

Runnable editChanged = new Runnable() {

@Override
public void run() {

mData.clear();
String data = mEditText.getText().toString();
int length = QuName.size();

for(int i = 0; i < length; i++){
HashMap<String,Object> item = new HashMap<String,Object>();
if(QuName.get(i).contains(data)
|| ShiName.get(i).contains(data)
|| ShengName.get(i).contains(data)){
item.put("name_qu",QuName.get(i));
item.put("name_shi",ShiName.get(i));
item.put("name_sheng", ShengName.get(i));
mData.add(item);
}
}
adapter.notifyDataSetChanged();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: