欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 高德地图之poi搜索功能的实现代码

程序员文章站 2024-02-11 21:49:46
废话不多说,先看效果,如果大家感觉不错,请参考实现代码 这个功能我是用fragmentdialog里面做的,也遇到不少坑 第一,就是设置背景的drawable为...

废话不多说,先看效果,如果大家感觉不错,请参考实现代码

Android 高德地图之poi搜索功能的实现代码

这个功能我是用fragmentdialog里面做的,也遇到不少坑

第一,就是设置背景的drawable为纯白色导致键盘弹出的时候,recyclerview的布局被顶上去导致出现白色布局,有点扎眼;最后改成了设置为和背景色一个颜色就和好了

  window window = getdialog().getwindow();
    windowmanager.layoutparams lp = window.getattributes();
    lp.gravity = gravity.center;
    window.setbackgrounddrawable(new colordrawable(contextcompat.getcolor(getactivity(), r.color.color_gray_f2)));
    window.setattributes(lp);

布局

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  xmlns:tools="http://schemas.android.com/tools"
  android:background="@color/color_gray_f2"
  android:orientation="vertical">
  <relativelayout
    android:id="@+id/search_maps_bar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_centerhorizontal="true"
    android:layout_marginleft="15dp"
    android:layout_marginright="15dp"
    android:layout_margintop="10dp"
    android:background="@drawable/new_card">
    <imagebutton
      android:id="@+id/dialog_search_back"
      android:layout_width="50dp"
      android:layout_height="match_parent"
      android:layout_centervertical="true"
      android:layout_margin="2dp"
      android:background="@drawable/button_background_selector"
      android:src="@drawable/ic_qu_appbar_back"/>
    <imagebutton
      android:id="@+id/dialog_serach_btn_search"
      android:layout_width="50dp"
      android:layout_height="match_parent"
      android:layout_alignparentright="true"
      android:layout_centervertical="true"
      android:layout_margin="2dp"
      android:background="@drawable/button_background_selector"
      android:src="@drawable/ic_qu_search"
      tools:ignore="contentdescription,rtlhardcoded"/>
    <edittext
      android:id="@+id/dialog_search_et"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_centerinparent="true"
      android:layout_marginleft="5.0dip"
      android:layout_marginright="5.0dip"
      android:layout_toleftof="@+id/dialog_serach_btn_search"
      android:layout_torightof="@+id/dialog_search_back"
      android:background="@android:color/transparent"
      android:completionthreshold="1"
      android:dropdownverticaloffset="1.0dip"
      android:hint="请输入关键字"
      android:imeoptions="actionsearch|flagnoextractui"
      android:inputtype="text|textautocomplete"
      android:maxheight="50dp"
      android:maxlength="20"
      android:minheight="50dp"
      android:singleline="true"
      android:textcolor="#000000"
      android:textsize="16.0sp"/>
  </relativelayout>
  <android.support.v7.widget.recyclerview
    android:id="@+id/dialog_search_recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginleft="15dp"
    android:layout_marginright="15dp"
    android:layout_margintop="@dimen/dp_10" />
</linearlayout>

第二个问题是键盘弹出的时候,会出现dialog布局整体被顶上去

最后通过设置 style来解决

  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    //解决dialogfragment布局不被顶上去的方法
    setstyle(dialogfragment.style_normal, android.r.style.theme_black_notitlebar);
  }

最后就是实现搜索功能了

第一个点击搜索时,键盘和搜索按钮两个都是同样的效果

/**
   * 搜索功能
   */
  private void searchlocationpoi() {
    //关闭键盘
    keyboardutils.closekeybord(poisearchinmaps, baseapplication.mcontext);
    if (textutils.isempty(poisearchinmaps.gettext().tostring().trim())) {
      toastutils.showtoastcenter("内容为空!");
    } else {
      query = new poisearch.query(poisearchinmaps.gettext().tostring().trim(), "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
      query.setpagesize(20);// 设置每页最多返回多少条poiitem
      query.setpagenum(0);// 设置查第一页
      poisearch = new poisearch(getactivity(), query);
      poisearch.setonpoisearchlistener(this);
      poisearch.searchpoiasyn();
    }
  }

然后回调中进行处理

@override
  public void onpoisearched(poiresult poiresult, int errcode) {
    logger.e(poiresult.getpois().tostring() + "" + errcode);
    if (errcode == 1000) {
      datas = new arraylist<>();
      arraylist<poiitem> pois = poiresult.getpois();
      for (int i = 0; i < pois.size(); i++) {
        locationbean locationbean = new locationbean();
        locationbean.title = pois.get(i).gettitle();
        locationbean.snippet = pois.get(i).getsnippet();
        datas.add(locationbean);
      }
      searchcaradapter.setnewdata(datas);
    }
  }

    还有就是监听edittext里面内容的变化来搜索,其实也很简单

 poisearchinmaps.addtextchangedlistener(new textwatcher() {
      @override
      public void beforetextchanged(charsequence charsequence, int i, int i1, int i2) {
      }
      @override
      public void ontextchanged(charsequence charsequence, int i, int i1, int i2) {
        textchangesearch(charsequence);
      }
      @override
      public void aftertextchanged(editable editable) {
      }
    });
  /**
   * 监听edittext内容的变化,去搜索
   */
  private void textchangesearch(charsequence charsequence) {
    string content = charsequence.tostring().trim();//获取自动提示输入框的内容
    logger.e(content);
    inputtipsquery inputtipsquery = new inputtipsquery(content, "");//初始化一个输入提示搜索对象,并传入参数
    inputtips inputtips = new inputtips(getactivity(), inputtipsquery);//定义一个输入提示对象,传入当前上下文和搜索对象
    inputtips.setinputtipslistener(new inputtips.inputtipslistener() {
      @override
      public void ongetinputtips(list<tip> list, int errcode) {
        logger.e(list.tostring() + errcode);
        if (errcode == 1000 && list != null) {
          datas = new arraylist<>();
          for (int i = 0; i < list.size(); i++) {
            locationbean locationbean = new locationbean();
            tip tip = list.get(i);
            locationbean.latitude = tip.getpoint().getlatitude();
            locationbean.longitude = tip.getpoint().getlongitude();
            locationbean.snippet = tip.getname();
            locationbean.title = tip.getdistrict();
            datas.add(locationbean);
          }
          searchcaradapter.setnewdata(datas);
        }
      }
    });//设置输入提示查询的监听,实现输入提示的监听方法ongetinputtips()
    inputtips.requestinputtipsasyn();//输入查询提示的异步接口实现
  }

ok,搞定,最后只需要搞个回调,把search后点击的item传回去就好了.希望对大家有所帮助