这几天在写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显示的城市信息

3.文本框的输入后自动提示

到了功能的重点了,来分析一下实现思路:

 (1).输入的自动提示文本框

 (2).获取地理信息的数据并传入,并且对当前城市筛选搜索信息

 (3).将信息显示出来

实现步骤:

 1).android为我们提供了自动提示文本框来实现输入关键字为其匹配相关的信息条目

       用法:http://www.cnblogs.com/tinyphp/p/3969984.html参考一下这篇文章

      注意它可以通过设置adapter来实现查询匹配信息的下拉列表

     我们主要是通过将自定义的listview来显示信息条目,在其ontextchange()中监听

 2).至于获取地理信息和相关具体搜索筛选的庞大工作量肯定不需要我们自己完成,高德地图已经为我们提供了一系列的封装方法和接口:

 我们去官网查看一下高德开发文档:


发现它为我们提供三个类和一个接口,先看下这个接口:


我们可以看到,这里面只为我们提供了一个方法:

void onGetInputtips(java.util.List inputTips,                    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> 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;    }}
然后是activity中的自动输入的实现代码:
   
@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);        }    }
关键代码部分都注释了,理解起来不难,如果对于其中方法和用法不熟悉,可以参考官方的开发参考手册和官方的实例。
来看一下最后我们的实现效果吧:
   
是简单了点,不过基本需求是达到了。
本文仅作记录,有不足和改进指出请提出,如要转载请附上文章原址,谢谢。

更多相关文章

  1. Android(安卓)Studio获取开发版SHA1值和发布版SHA1值的史上最详
  2. android使用adb向AS自带虚拟机里安装apk
  3. BlockCanary — 轻松找出Android(安卓)App界面卡顿元凶
  4. 关于Volley的问题,GET方式下输入有空格的参数居然解析错误,导致不
  5. Android输入控件详解
  6. Android笔记之开发中处理异常并写入本地log文件
  7. Android广播机制---发送本地广播_android全局信息处理本地广播安
  8. Android学习札记50:在Android中自定义捕获Application全局异常
  9. android输入字符限制

随机推荐

  1. MySQL中or、in、union与索引优化详析
  2. win10 mysql导出csv的两种方式
  3. MySQL中索引失效的常见场景与规避方法
  4. mysql存储过程之循环语句(WHILE,REPEAT和LO
  5. mysql事件之修改事件(ALTER EVENT)、禁用事
  6. mysql的计划任务与事件调度实例分析
  7. mysql触发器之触发器的增删改查操作示例
  8. mysql日期处理函数实例解析
  9. Mysql临时表原理及创建方法解析
  10. Mysql备份多个数据库代码实例