zoukankan      html  css  js  c++  java
  • AutoCompleteTextView搭配Poi搜索实现多项选择

    项目需要 需要用到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上了,在博客标题下就是,只不过这个项目还没有完结,之后再慢慢更新吧

  • 相关阅读:
    每日优鲜三面:在Spring Cloud实战中,如何用服务链路追踪Sleuth?
    一文就能看懂的Nginx操作详解,你还在查漏补缺吗!
    火花思维三面:说说Redis分布式锁是如何实现的!
    【秋招必备】Dubbo面试题(2021最新版)
    【秋招必备】Elasticsearch面试题(2021最新版)
    熬了一通宵!你竟然都没有弄懂陌陌面试官问的Java虚拟机内存?
    react-native-vector-icons 使用记录
    git
    在iOS项目中嵌入RN代码
    UITabBar 图标上下跳动
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9350316.html
Copyright © 2011-2022 走看看