EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 :
预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :
(3) 在 SelectCity.java 中编写 2 个 HashMap, 用于存放名字到城市编码还有名 字到拼音的映射 为了通过城市名称返回 MainActivity.java 的城市代码 (4) 在 SelectCity.java 中, 为 ListView 设置适配器 (5) 通过 ArrayAdpter 的 getfilter() 方法来实现搜索功能
(6) 在 OnClick 方法中通过 Intent 传递城市代码 (7) 运行安卓虚拟机, 发现无法输入中文 我们可以通过下载搜狗输入法到虚拟机中解决, 但是需要 X86 版本 在本机下载好 apk 安装包后, 直接拖动到虚拟机内即可完成安装 然后设置为默认输入法即可 搜狗输入 X86 版较为难找 百度网盘如下 :https://pan.baidu.com/s/1kai2y9e2r9ijxagginq1qq
3. 参考资料 (1)https://blog.csdn.net/lone1ycode/article/details/79558021 (2)https://www.jb51.net/article/109480.htm (3)https://blog.csdn.net/qq_20082961/article/details/52504400 4. 源代码 : (1)Select_city.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/city_title" android:layout_width="fill_parent" android:layout_height="45.0dip" android:background="#ffcd2626"> <TextView android:id="@+id/title_name" android:layout_width="fill_parent" android:layout_height="fill_parent"
android:gravity="center" android:text=" 当前城市 : 北京 " android:textcolor="#ffffffff" android:textsize="20.0dip" /> <ImageView android:id="@+id/title_back" android:layout_width="45.0dip" android:layout_height="45.0dip" android:layout_alignparentleft="true" android:layout_centervertical="true" android:src="@drawable/base_action_bar_back_normal" /> <ImageView android:layout_width="1.0dip" android:layout_height="40dip" android:layout_centervertical="true" android:layout_gravity="center" android:layout_torightof="@id/title_back" android:background="#a71717" android:gravity="center" /> </RelativeLayout> <LinearLayout android:background="@drawable/love" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/city_title"> <ListView android:id="@+id/list_view" android:choicemode="singlechoice" android:dividerheight="2px" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout> <EditText android:id="@+id/search_edit" android:layout_width="fill_parent" android:layout_height="55dp"
android:layout_alignparentbottom="true" android:layout_alignparentend="true" android:background="@drawable/contact_search_box_edittext_keyword_backgr ound" android:drawableleft="@drawable/magnifying_glass" android:drawablepadding="10.0dip" android:hint=" 搜索全国城市 ( 中文 )" android:imeoptions="actionsearch" android:paddingbottom="14.0dp" android:paddingleft="15.0dp" android:paddingright="30.0dp" android:paddingtop="15.0dp" android:singleline="true" android:textcolor="#ff000000" android:textcolorhint="#ffcccccc" /> </RelativeLayout> (2)SelectCity.java package com.example.zouyu.miniweather; import com.example.zouyu.app.myapplication; import com.example.zouyu.bean.city; import android.app.activity; import android.content.intent; import android.content.searchrecentsuggestionsprovider; import android.os.bundle; import android.support.annotation.nullable; import android.text.editable; import android.text.textwatcher; import android.util.log; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.edittext; import android.widget.imageview; import android.widget.listview; import android.widget.textview; import android.widget.toast; import java.util.arraylist;
import java.util.hashmap; import java.util.list; import java.util.map; public class SelectCity extends Activity implements View.OnClickListener { // 监听按钮 private ImageView mbackbtn; private TextView mtestbtn; // 搜索栏和 ListView private ListView listview = null;// 声名 listview 对象, 用于绑定 select_city 布局文件中的 ListView private TextView cityselected = null; // 声名 TextView 对象, 用于绑定 select_city 布局文件中顶部栏的显示内容 private List<City> listcity = MyApplication.getInstance().getCityList(); private int listsize = listcity.size(); // 建立 listcity 长度的 String[] 数组, 用于存储要在 ListView 中展示的内容 private String[] city = new String[listSize]; private ArrayList<String> msearchresult = new ArrayList <>(); // 搜索结果 private Map<String,String> nametocode = new HashMap <>();// 城市名到编码 private Map<String,String> nametopinyin = new HashMap <>(); // 城市名到拼音 // 搜索功能 private EditText msearch; String returncode; protected void oncreate(@nullable Bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.select_city); // onclick 方法要在这里写绑定监听事件 mbackbtn = (ImageView) findviewbyid(r.id.title_back); mbackbtn.setonclicklistener(this); mtestbtn = (TextView) findviewbyid(r.id.title_name);
mtestbtn.setonclicklistener(this); // 实现 ListView 对数组的展示 // listview = new ListView(this); // listview.setadapter(new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,getData())); // setcontentview(listview); cityselected = (TextView) findviewbyid(r.id.title_name); Log.i("City", listcity.get(1).getcity()); for (int i = 0; i < listsize; i++) { city[i] = listcity.get(i).getcity(); Log.d("City", city[i]); // 建立映射 String strname; String strnamepinyin; String strcode; for(city city1:listcity){ strcode = city1.getnumber(); strname = city1.getcity(); strnamepinyin = city1.getfirstpy(); nametocode.put(strname,strcode); nametopinyin.put(strname,strnamepinyin); msearchresult.add(strname); final ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_single_choice, msearchresult); listview = findviewbyid(r.id.list_view); listview.setadapter(arrayadapter); // 设置适配器 listview.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview <?> adapterview, View view, int i, long l) { String returncityname = msearchresult.get(i); Toast.makeText(SelectCity.this, " 你已选择 :" + returncityname, Toast.LENGTH_SHORT).show(); // cityselected.settext(" 当前城市 :" + city[i]); returncode = nametocode.get(returncityname);
); Log.d("returncode",returnCode); cityselected.settext(" 当前城市 :" + returncityname); msearch = (EditText)findViewById(R.id.search_edit); msearch.addtextchangedlistener(new TextWatcher() { public void beforetextchanged(charsequence s, int start, int count, int after) { public void ontextchanged(charsequence s, int start, int before, int count) { arrayadapter.getfilter().filter(s); public void aftertextchanged(editable s) { ); private List<String> getdata() { List<String> data = new ArrayList<String>(); data.add(" 测试数据 1"); data.add(" 测试数据 2"); data.add(" 测试数据 3"); return data; public void onclick(view v) { if (v.getid() == R.id.title_back) { Log.d("myWeather", " 我点击了返回界面 "); int position = listview.getcheckeditemposition(); String select_citycode = listcity.get(position).getnumber(); Intent i = new Intent(); i.putextra("citycode",returncode );
setresult(result_ok, i); finish(); if (v.getid() == R.id.title_name) { Log.d("myWeather", " 我是北京 ");