项目需要 需要用到AutoCompleteTextView控件,在输入之后能在下方产生一个推荐结果的列表,就类似于金山词霸一类软件.输入一两个字符就能出来一系列类似的的单词,

这里做的例子是输入城市名和具体的地点名,然后得到推荐的结果,在下面显示出来,选择其中一个然后再地图上进行标记

效果图:

首先是AutoCompleteTextView部分

<AutoCompleteTextView
android:id="@+id/search_content"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:completionThreshold="1"
android:maxLines="1" />
android:completionThreshold="1"是设置当它输入一个字符的时候就有提示出来
之后,就是对其中的文本进行监听和对推荐列表中的Item进行监听
searchByInput = (AutoCompleteTextView) findViewById(R.id.search_content);
//设置文本监听
searchByInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//改变前
} @Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//改变中
addSearch();
} @Override
public void afterTextChanged(Editable s) {
//改变后
addSearch();
}
});
//设置选择Item监听
searchByInput.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try{
//记录位置
myAddress = searchResult.get(position);
Toast.makeText(Welcome.this,"position = "+ myAddress,Toast.LENGTH_SHORT).show();
}catch (NullPointerException e){
Toast.makeText(Welcome.this,"请输入内容",Toast.LENGTH_SHORT).show();
}
}
});

然后就是利用输入得到的文本就行POI检索了

POI即Point of interest,例如餐厅酒吧这些,都可以算是POI,百度地图提供专门的POI,给开发人员用,在上面的代码中的addResearch中就是进行POI的检索

public void addSearch(){
//根据城市名和key搜索
poiCitySearchOption = new PoiCitySearchOption();
poiCitySearchOption.city(myCity).keyword(searchByInput.getText().toString()).pageNum(0).pageCapacity(10);
poiSearch.searchInCity(poiCitySearchOption);
}

之后对poiSearch监听,得到搜索的结果

poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
searchResult = new ArrayList<>();
if(poiResult.error == SearchResult.ERRORNO.NO_ERROR){
if(searchResult.size()!=0){
//如果不是空 就先清除之前的查询结果
searchResult.clear();
for (int i = 0; i < poiResult.getAllPoi().size();i++){
//添加进入列表
searchResult.add(poiResult.getAllPoi().get(i).name+","+poiResult.getAllPoi().get(i).area);
}
//适配器的初始化和设置适配器
ArrayAdapter<String> resultAdapter = new ArrayAdapter<>(getApplicationContext(),R.layout.search_content,searchResult);
searchByInput.setAdapter(resultAdapter);
}else {
for (int i = 0; i < poiResult.getAllPoi().size();i++){
searchResult.add(poiResult.getAllPoi().get(i).name+","+poiResult.getAllPoi().get(i).address);
}
ArrayAdapter<String> resultAdapter = new ArrayAdapter<>(getApplicationContext(),R.layout.search_content,searchResult);
searchByInput.setAdapter(resultAdapter);
}
}
}

这里要说的是,AutoCompleteTextView需要自己弄一个适配器,适配器需要单独一个布局文件,下面是我的适配器的布局文件

<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/every_result"
android:layout_width="match_parent"
android:layout_height="40dp" />

选择相应的Item后,再进行一个地图解码的过程,由名称的到地点的经纬度,然后创建一个Marker添加到地图上

所以要先对Item监听,即对推荐的结果的列表进行监听

searchByInput.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try{
//记录位置
myAddress = searchResult.get(position);
Toast.makeText(Welcome.this,"position = "+ myAddress,Toast.LENGTH_SHORT).show();
}catch (NullPointerException e){
Toast.makeText(Welcome.this,"请输入内容",Toast.LENGTH_SHORT).show();
}
}
});
searchByAddress.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if(geoCodeResult.error==SearchResult.ERRORNO.NO_ERROR){
LatLng destination = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
OverlayOptions destinationOption = new MarkerOptions()
.position(destination).
icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka));
baiduMap.addOverlay(destinationOption);
baiduMap.addOverlay(myLocationOption);
}else {
Toast.makeText(Welcome.this,"查询失败",Toast.LENGTH_SHORT).show();
baiduMap.addOverlay(myLocationOption);
}
} @Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { }
});

在做这个的时候被坑了的地方,一个就是AutoCompleteTextView这个控件需要适配器,我在适配器的布局文件里加入了LearLayout标签,然后把TextView放入里面,导致之前怎么都出不来这个推荐列表,

另外就是没查询一个.就必须把之前的存放搜索结果的List进行清空,项目源码我都放到GitHub上了,在博客标题下就是,只不过这个项目还没有完结,之后再慢慢更新吧

最新文章

  1. Lisp和SICP
  2. Cheat sheets
  3. Android EditText输入格式设置
  4. 查看当前正在运行的activity
  5. 【转】HTTP中的长连接和短连接分析
  6. Object Pascal 语言基础
  7. 论文笔记之:Fully Convolutional Attention Localization Networks: Efficient Attention Localization for Fine-Grained Recognition
  8. JS调用iframe方式实现Web区域打印页面内容
  9. Silk Mobile – 缩短移动应用的测试周期
  10. poj3624Charm Bracelet
  11. htop安装步骤【原创】
  12. easyUI datagrid 列宽自适应(简单 图解)(转)
  13. 搭建eclipse+tomcat开发环境
  14. Vue-cli+Vue.js2.0+Vuex2.0+vue-router+es6+webpack+node.js脚手架搭建和Vue开发实战
  15. 码农、黑客和2B程序员之间的区别
  16. [Spoj]Counting Divisors (cube)
  17. Python爬虫入门这一篇就够了
  18. Python基础语法(三)
  19. C#通过代码判断并注册程序集到GAC
  20. sql 中的null值

热门文章

  1. MariaDBConn用于链接MariaDB的管理类
  2. python:OS模块
  3. IE 8 浏览器 F12 调试功能无法使用
  4. Java四种排序:冒泡,选择,插入,二分(折半插入)
  5. Path类对路径字符串的操作
  6. leaflet入门(五)API翻译(下)
  7. Ng第十七课:大规模机器学习(Large Scale Machine Learning)
  8. 关于Lambda
  9. vs和vim
  10. user_agent