这几天在写android高德地图相关的项目,遇到实现乘客选择上下车地点的功能,其中涉及到搜索界面中文本框的地点输入的自动提示模块,先来看下滴滴上该功能的效果图:
从图中分析并划分一下简单功能需求:
1).主界面的定位功能
2).主界面点击目的地的TextView跳转到搜索目的地的界面
3).搜索界面文本框前面显示当前所在城市,也就是当前的定位信息
4).文本框的输入后自动提示
简单来说,就这些功能,那么我们来逐一实现一下吧:
1.主界面的定位功能
这一块比较简单,高德地图官网给出了具体实现,网上也有很多相关文章,这里就直接跳过了,想省事的可以看看这篇文章:http://blog.csdn.net/jwzhangjie/article/details/43151045
2.主界面点击选择目的地跳转到搜索界面,并在搜索界面显示城市信息
二和三两个功能模块我就连起来讲了,因为这里简单涉及到两个activity之间的数据传递,主要用intent这个意图来实现,这里就贴上关键代码吧:
(1).发送城市数据:
searchPlace=amapLocation.getCity();//获取所在城市信息
case R.id.drop_off: //poi搜索界面的跳转 Intent intent_search=new Intent(MainMenuActivity.this, POISearchActivity.class); intent_search.putExtra("city",searchPlace);//将定位的城市信息传入poi搜索事件处理 startActivity(intent_search); break;(2).接收城市数据:
public String sendCityInfo(){//将前面定位数据中的city数据传过来 String info;//前面定位所在城市信息 Intent intent=this.getIntent(); info=intent.getStringExtra("city"); return info; }
TextView city_tv;//显示当前定位城市信息的tv
city_tv= (TextView) findViewById(R.id.locate_city);
city_tv.setText(sendCityInfo());//设置tv显示的城市信息
到了功能的重点了,来分析一下实现思路:
(1).输入的自动提示文本框
(2).获取地理信息的数据并传入,并且对当前城市筛选搜索信息
(3).将信息显示出来
实现步骤:
1).android为我们提供了自动提示文本框来实现输入关键字为其匹配相关的信息条目
用法:http://www.cnblogs.com/tinyphp/p/3969984.html参考一下这篇文章
注意它可以通过设置adapter来实现查询匹配信息的下拉列表
我们主要是通过将自定义的listview来显示信息条目,在其ontextchange()中监听
2).至于获取地理信息和相关具体搜索筛选的庞大工作量肯定不需要我们自己完成,高德地图已经为我们提供了一系列的封装方法和接口:
我们去官网查看一下高德开发文档:
发现它为我们提供三个类和一个接口,先看下这个接口:
我们可以看到,这里面只为我们提供了一个方法:
void onGetInputtips(java.util.ListinputTips, int resultID)
后面说的很清楚,它是用来输入提示回调时调用的方法,注意一下它的参数,第一个是Tip类,它是干嘛用的呢?我们点进去看一下这个类:
它为我们提供了很多信息:主要是一些地理信息(经纬度,区域编码,详细地址信息等)
那么我们可以断定,这个list就是我们需要的地理数据。
(3).显示匹配到的数据
这里我是通过自己定义的SearchAdapter为下面的listview适配数据来实现的,字条目数据是一个List>类型,键值对的key为“name”,其对应的就是地址名的信息,然后用list将其存储并在listview上显示
说那么多,还是看下功能代码吧:
首先是适配器:
/** * Created by Administrator on 2017/3/10. * 搜索显示列表的数据适配器类 */ public class SearchAdapter extends BaseAdapter { private List然后是activity中的自动输入的实现代码:> addressData; private LayoutInflater layoutInflater; public SearchAdapter(Context context) { layoutInflater=LayoutInflater.from(context); addressData=new ArrayList >() ; } @Override public int getCount() { return addressData.size(); } @Override public Object getItem(int position) { return addressData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh = null; if(convertView == null){ vh = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.search_list_item, null); vh.title = (TextView) convertView.findViewById(R.id.search_item_title); vh.text = (TextView) convertView.findViewById(R.id.search_item_text); convertView.setTag(vh); }else{ vh = (ViewHolder) convertView.getTag(); } vh.title.setText(addressData.get(position).get("name")); vh.text.setText(addressData.get(position).get("address")); return convertView; } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_poisearch); search_edittext= (AutoCompleteTextView) findViewById(R.id.search_edit); search_list= (ListView) findViewById(R.id.search_list); city_tv= (TextView) findViewById(R.id.locate_city); search_for_place= (TextView) findViewById(R.id.search_for_place); search_edittext.addTextChangedListener(this); search_list.setOnItemClickListener(this); search_for_place.setOnClickListener(this); city_tv.setText(sendCityInfo());//设置tv显示的城市信息 city=sendCityInfo();//将前面的定位城市信息传入作为搜索参数 } public String sendCityInfo(){//将前面定位数据中的city数据传过来 String info;//前面定位所在城市信息 Intent intent=this.getIntent(); info=intent.getStringExtra("city"); return info; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String content=s.toString().trim();//获取自动提示输入框的内容 InputtipsQuery inputtipsQuery=new InputtipsQuery(content,city);//初始化一个输入提示搜索对象,并传入参数 inputtipsQuery.setCityLimit(true);//将获取到的结果进行城市限制筛选 Inputtips inputtips=new Inputtips(this,inputtipsQuery);//定义一个输入提示对象,传入当前上下文和搜索对象 inputtips.setInputtipsListener(this);//设置输入提示查询的监听,实现输入提示的监听方法onGetInputtips() inputtips.requestInputtipsAsyn();//输入查询提示的异步接口实现 } @Override public void afterTextChanged(Editable s) { } @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { // PositionEntity entity = (PositionEntity) searchAdapter.getItem(position); // if (entity.latitue == 0 && entity.longitude == 0) { // PoiSearchTask poiSearchTask=new PoiSearchTask(getApplicationContext(), searchAdapter); // poiSearchTask.search(entity.address,RouteTask.getInstance(getApplicationContext()).getStartPoint().city); // // } else { //// mRouteTask.setEndPoint(entity); //// mRouteTask.search(); // Intent intent = new Intent(POISearchActivity.this, MainMenuActivity.class); // intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); // startActivity(intent); // finish(); // } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.search_for_place: PoiSearchTask poiSearchTask=new PoiSearchTask(getApplicationContext(), searchAdapter); poiSearchTask.search(search_edittext.getText().toString(),RouteTask.getInstance(getApplicationContext()).getStartPoint().city); break; } } @Override /* 输入提示的回调方法 参数1:提示列表 参数2:返回码 */ public void onGetInputtips(List关键代码部分都注释了,理解起来不难,如果对于其中方法和用法不熟悉,可以参考官方的开发参考手册和官方的实例。list, int returnCode) { if(returnCode== AMapException.CODE_AMAP_SUCCESS){//如果输入提示搜索成功 List > searchList=new ArrayList >() ; for (int i=0;i hashMap=new HashMap (); hashMap.put("name",list.get(i).getName()); hashMap.put("address",list.get(i).getDistrict());//将地址信息取出放入HashMap中 searchList.add(hashMap);//将HashMap放入表中 } searchAdapter=new SearchAdapter(this);//新建一个适配器 search_list.setAdapter(searchAdapter);//为listview适配 SimpleAdapter aAdapter = new SimpleAdapter(getApplicationContext(), searchList, R.layout.search_list_item, new String[] {"name","address"}, new int[] {R.id.search_item_title, R.id.search_item_text}); search_list.setAdapter(aAdapter); aAdapter.notifyDataSetChanged();//动态更新listview }else{ ToastUtil.show(this,returnCode); } }
来看一下最后我们的实现效果吧:
是简单了点,不过基本需求是达到了。
本文仅作记录,有不足和改进指出请提出,如要转载请附上文章原址,谢谢。