1. 程式人生 > >Android實現高德地圖POI搜尋

Android實現高德地圖POI搜尋

效果圖如下:
效果圖
匯入高德地圖的搜尋服務包到工程的libs目錄中,並配置好許可權與使用者KEY。
許可權如下:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

使用者KEY配置如下:

<meta-data 
     android:name="com.amap.api.v2.apikey"
     android:value
="這裡填你的KEY"/>

建立activity_main.xml佈局檔案如下,因為要實現使用者輸入直接就顯示資料,所以就沒用到搜尋按鈕。

<?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"
    android:orientation="vertical"
>
<EditText android:id="@+id/search_edit" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ListView android:id="@+id/search_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>

建立address_item.xml佈局檔案如下,用於ListView中每一個Item佈局。

<?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"
    android:orientation="vertical"
    android:padding="20dp" >
    <TextView 
        android:id="@+id/item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="標題"
        android:textSize="20sp"/>
    <TextView 
        android:id="@+id/item_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="內容"
        android:textColor="#FF4A4A4A"/>
</LinearLayout>  

建立AddressBean實體類,程式碼如下

   public class AddressBean {
    private double longitude;//經度
    private double latitude;//緯度
    private String title;//資訊標題
    private String text;//資訊內容
    public AddressBean(double lon, double lat, String title, String text){
        this.longitude = lon;
        this.latitude = lat;
        this.title = title;
        this.text = text;
    }
    public double getLongitude() {
        return longitude;
    }

    public double getLatitude() {
        return latitude;
    }
    public String getTitle() {
        return title;
    }
    public String getText(){
        return text;
    }
}

建立SearchAdapter資料介面卡類,程式碼如下:

public class SearchAdapter extends BaseAdapter{
    private List<AddressBean> data;
    private LayoutInflater li;
    public SearchAdapter(Context context){
        li = LayoutInflater.from(context);
    }

    /**
     * 設定資料集
     * @param data
     */
    public void setData(List<AddressBean> data){
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.size();
    }
    @Override
    public Object getItem(int position) {
        return data.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 = li.inflate(R.layout.address_item, null);
            vh.title = (TextView) convertView.findViewById(R.id.item_title);
            vh.text = (TextView) convertView.findViewById(R.id.item_text);
            convertView.setTag(vh);
        }else{
            vh = (ViewHolder) convertView.getTag();
        }
        vh.title.setText(data.get(position).getTitle());
        vh.text.setText(data.get(position).getText());
        return convertView;
    }

    private class ViewHolder{
        public TextView title;
        public TextView text;
    }
}

這裡會提供方法setData()用於動態更新資料集。

建立InputTask類,封裝PoiSearch的搜尋服務,並與Adapter進行繫結。

public class InputTask implements OnPoiSearchListener {
    private static InputTask mInstance;
    private SearchAdapter mAdapter;
    private PoiSearch mSearch;
    private Context mContext;
    private InputTask(Context context, SearchAdapter adapter){
        this.mContext = context;
        this.mAdapter = adapter;
    }
    /**
     * 獲取例項
     * @param context 上下文
     * @param adapter 資料介面卡
     * @return
     */
    public static InputTask getInstance(Context context, SearchAdapter adapter){
        if(mInstance == null){
            synchronized (InputTask.class) {
                if(mInstance == null){
                    mInstance = new InputTask(context, adapter);
                }
            }
        }
        return mInstance;
    }
    /**
     * 設定資料介面卡
     * @param adapter
     */
    public void setAdapter(SearchAdapter adapter){
        this.mAdapter = adapter;
    }
    /**
     * POI搜尋
     * @param key 關鍵字
     * @param city 城市
     */
    public void onSearch(String key, String city){
        //POI搜尋條件
        PoiSearch.Query query = new PoiSearch.Query(key, "", city);
        mSearch = new PoiSearch(mContext, query);
        //設定非同步監聽
        mSearch.setOnPoiSearchListener(this);
        //查詢POI非同步介面
        mSearch.searchPOIAsyn();
    }
    /**
     * 非同步搜尋回撥
     */
    @Override
    public void onPoiSearched(PoiResult poiResult, int rCode) {
        if(rCode == 0 && poiResult != null){
            ArrayList<AddressBean> data = new ArrayList<AddressBean>();
            ArrayList<PoiItem> items = poiResult.getPois();
            for(PoiItem item : items){
                //獲取經緯度物件
                LatLonPoint llp = item.getLatLonPoint();
                double lon = llp.getLongitude();
                double lat = llp.getLatitude();
                //獲取標題
                String title = item.getTitle();
                //獲取內容
                String text = item.getSnippet();
                data.add(new AddressBean(lon, lat, title, text));
            }
            mAdapter.setData(data);
            mAdapter.notifyDataSetChanged();
        }
    }
}  

使用PoiSearch.Query定義搜尋條件,構造方法有三個引數分別是:搜尋關鍵字、POI類別、城市(地區)。
其中多個關鍵字用“|”分割,POI類別可以為”“空字串代表不區分類別,城市可以為”“空字串代表檢索所有城市。
在搜尋到結果回撥的時候使用notifyDataSetChanged()更新資料介面卡,實現資料動態更新。

建立MainAty類,程式碼如下:

public class MainAty extends Activity implements TextWatcher, OnItemClickListener{
    private static final String TAG = "MainAty";
    private EditText edit;
    private ListView lv;
    private SearchAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView(){
        edit = (EditText) findViewById(R.id.search_edit);
        lv = (ListView) findViewById(R.id.search_list);
        edit.addTextChangedListener(this);
        mAdapter = new SearchAdapter(this);
        lv.setAdapter(mAdapter);
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        InputTask.getInstance(this, mAdapter).onSearch(s.toString(), "");
    }
    @Override
    public void afterTextChanged(Editable s) {

    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        //Item點選事件處理
    }
}  

實現TextWatcher,並重寫onTextChanged方法監聽輸入框資料的變化,從而實現實時更新資料。

相關推薦

Android實現地圖POI搜尋

效果圖如下: 匯入高德地圖的搜尋服務包到工程的libs目錄中,並配置好許可權與使用者KEY。 許可權如下: <uses-permission android:name="android.permission.INTERNET"/> <

Android實現地圖定位詳細流程

 要實現高德地圖定位呢,首先需要做好以下幾步準備:  如果你嫌筆者寫的不好或者懶得看,只需要程式碼的話,請選擇: github:點選開啟連結,此連線可能和文章內容有所出入,因

地圖---Poi搜尋遇到的坑

1.根據關鍵字檢索POI 我剛開始認為這才是最關鍵的搜尋方法,可以搜尋到任何想要的資訊,但是發現,並不是,它只能搜尋到像北京這樣的城市名字,其餘的都是nothiing,但這個方法下還有這個 List<SuggestionCity> suggest

Android實現地圖自定義樣式

放置Android工程下的assets資料夾,在assets資料夾裡面建立了一個styleMap子資料夾。將裡面的檔案寫到sd卡中。 寫出檔案程式碼: try { // 先獲取系統

android studio實現地圖api定位

簡單的demo:https://my.oschina.net/zhangqie/blog/845488 SHA1值的獲取:參考高德官網:http://lbs.amap.com/faq/top/hot-questions/253/ publicstatic String sH

Android簡單實現地圖顯示及定位

1、要實現高德地圖的定位,首先要下載高德地圖的SDK 下載地址:http://lbs.amap.com/api/android-location-sdk/download/ 然後在高德地圖官網上登入你註冊的賬號並且去控制檯

js中實現地圖坐標經緯度轉百度地圖坐標

math.sqrt pan poi 結果 mat blog 筆記 百度 說明 1 function tobdMap(x, y) { 2 var x_pi = 3.14159265358979324 * 3000.0 / 180.0; 3

java實現地圖經緯度轉換成百度地圖

因為專案中使用到了高德地圖的API獲取到了某查詢位置的經緯度,但是頁面定位的時候是使用的百度地圖,所以這其中需要進行相應的轉碼。高德使用的是火星座標(地球座標加密後的地址),百度地圖使用的是自己加密後的經緯度。 編寫經緯度實體類 package com.liang.work.e

Android地圖根據2個座標智慧縮放地圖

需求: 在地圖上給定2個座標點,然後將2個座標點通過縮放都能顯示出來。 實現: 通過查閱高德地圖接入文件和API能找到縮放的API高德地圖文件,看到以下說明 限制地圖的顯示範圍 從地圖 SDK V4.1.0 起新增了設定地圖顯示範圍的方法,手機螢幕僅顯示設定的地圖

百度地圖poi資料下載

          對於地圖產品而言,某個地理位置周邊的資訊,稱之為 POI 。百度地圖的官方文件中是這麼解釋的:位置資料,point of information。不過網路上也有其他的說法,point of interest ,地圖上任何

2018年地圖POI全國資料下載

    全國商戶、樓宇、社群、公交,景點、學校、加油站,汽車維修與服務等各類地圖資料,有經緯度,電話。2018全國最新poi資料資料,詳細到樓棟出入口。 對於地圖產品而言,某個地理位置周邊的資訊,稱之為 POI 。百度地圖的官方文件中是這麼解釋的:位置資料,poin

react-native(android) 使用地圖

在react-native中使用高德地圖(android 端) 功能實現: 顯示地圖 定位 查詢周邊的 poi 1.安裝依賴 npm install react-native-amap3d 2.構建配置 react-native link react-nativ

地圖 定位 搜尋

<body> <input type="text" id="mymap_search"> <button class="search">search</button> <input type="text" name=

全國百度地圖poi資料下載

2018年11月11日 13:33:00 wanjiawen0260 閱讀數:15 標籤: poi

android呼叫地圖的方法

Intent intent2 = null;try { intent2 = Intent.getIntent("androidamap://route?sourceApplication=softname&sname=我的位置&"+"&dname="+name+"&dev

Android呼叫地圖app語音導航

    直接呼叫高德地圖app進行導航     首先,要先進入高德開放平臺,註冊登入以後,建立自己的APP,然後會生成appkey     高德開放平臺網址: http://lbs.amap.com/    然後下載jar包匯入專案工程之中                

實現地圖後臺持續定位

 高德地圖實現在後臺持續定位,當然需要服務,但是現在已經無法在殺死APP的時候仍然持續獲取了,我這種形式只能在APP沒被殺死的時候持續獲取,獲取到定位資訊後你可以回調出去,下面就是我這個服務 public class LocationService extends Service {

Android基於地圖實時定位服務

Service功能有:實時定位(後臺進行) Service不會,去百度谷歌 功能有 實時定位(30秒間隔) 判斷是否在規定的時間段內 判斷距離是否大於規定的距離 判斷服務是否在開啟的狀態 服務程式碼:LocationService(Android

js呼叫地圖搜尋api

<link rel="stylesheet" href="https://cache.amap.com/lbs/static/main.css"/> <script type="text/javascript" src="https://webap

定位+poi搜尋

package com.amap.map2d.demo.location; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; impo