2017-10-12 56 views
0

有人知道我如何填寫此自動完成,該用戶只收回城市名稱?只有像倫敦,巴黎等等,沒有其他的結果:「倫敦橋」,「倫敦眼」等等。 我在谷歌的地方API自動完成使用,自動完成 - 只有城市

所以我用這個代碼過濾器:

public Filter getFilter() { 
    Filter filter = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      synchronized (filterResults) { 

       if (constraint != null) { 
        getAutocomplete(constraint); 
        result = mPlaceAPI.autocomplete(constraint.toString()); 

        if (result != null) { 
         filterResults.values = result; 
         filterResults.count = result.size(); 
        } 
       } 
       return filterResults; 

,並獲得唯一的城市名稱:

HttpURLConnection conn = null; 
    StringBuilder jsonResults = new StringBuilder(); 

    try { 
     StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); 
     sb.append("?key=" + API_KEY); 
     sb.append("&types=(cities)"); 
     sb.append("&input=" + URLEncoder.encode(input, "utf8")); 

enter image description here

非常感謝: )

回答

0

我不知道你爲什麼建設inte rnet請求,但如果沒有必要,則可以使用Google Places API。 下面是谷歌guide

在您的應用程序,你必須實現只有幾個步驟:

1)建立和連接谷歌API客戶端

googleApiClient = new GoogleApiClient.Builder(Activity.this) 
      .addApi(Places.GEO_DATA_API) 
      .build(); 
    googleApiClient.connect(); 

2)然後你有幾個方法怎麼辦:使用自動完成意圖,PlaceAutocompleteFragment或創建PendingResult<AutocompletePredictionBuffer>,從中獲取結果並在需要的地方使用它。我不得不使用最後一個,所以我創建AutocompleteFilter

AutocompleteFilter.Builder builder = new AutocompleteFilter.Builder() 
.setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES); 

你可以看到AutocompleteFilter常數here 然後創建PendingResult

PendingResult<AutocompletePredictionBuffer> result 
         = Places 
         .GeoDataApi 
         .getAutocompletePredictions(googleApiClient, charSequence.toString(), null, builder.build()); 

,做我需要回調

result.setResultCallback(new ResultCallback<AutocompletePredictionBuffer>{...}); 

什麼在回調中,您可以像這樣收到信息:

Status status = autocompletePredictions.getStatus(); 
        Handler handler = new Handler(); 
        int size = autocompletePredictions.getCount(); 
        if (status.isSuccess()){ 
         for (int i = 0; i < size; i++){ 
          //Do what you need 
         } 
        } 

也許這不是最好的方法,但它對我和它的工作類似於建設請求,就像你(根據我的意見)。無論如何,你可以在guide中找到最適合你的方法。 希望我幫助你,如果我浪費你的時間對不起。

+0

@你在這裏有一些錯誤?如果不是,你可以把斷點放在你想從結果中獲取數據並觀察這裏的情況嗎?並確保您以正確的方式連接GoogleApiClient。 –

+0

我沒有得到一個錯誤消息,我把斷點,他給我,過濾器正在做..但我還是沒有得到只有城市的過濾器..我不知道我想念什麼,我應該做什麼.. – Bon

+0

@Bon過濾器工作良好,我的意思是把破發點中的回調並觀看結果,你得到 –

0

這是我的代碼,我需要從結果autocomlete API谷歌的地方onlt城市: 在MainActivity:

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .addApi(Places.GEO_DATA_API) 
      .build(); 

} 

@Override 
public void onConnected(Bundle bundle) { 
} 

@Override 
public void onConnectionSuspended(int i) { 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
} 

public void searchPlace(final Editable editable) { 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (!editable.toString().equals("") && mGoogleApiClient.isConnected()) { 
       try { 
        mAutoCompleteAdapter.getFilter().filter(editable.toString()); 

       } catch (Exception e) { 
        Log.e(TAG, "Exception"); 

的另一個活動:PlaceAPI

public ArrayList<String> autocomplete (String input) { 
    ArrayList<String> resultList = null; 

    HttpURLConnection conn = null; 
    StringBuilder jsonResults = new StringBuilder(); 

    try { 
     StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); 
     sb.append("?key=" + API_KEY); 
     sb.append("&types=(cities)"); 
     sb.append("&input=" + URLEncoder.encode(input, "utf8")); 

     URL url = new URL(sb.toString()); 
     conn = (HttpURLConnection) url.openConnection(); 
     InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

適配器:

private ArrayList<String> result; 


@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      synchronized (filterResults) { 

       if (constraint != null) { 
        getAutocomplete(constraint); 
        result = mPlaceAPI.autocomplete(constraint.toString()); 

        if (result != null) { 
         filterResults.values = result; 
         filterResults.count = result.size(); 
        } 
       } 
       return filterResults; 
      } 
     } 


     @Override 
     protected void publishResults(CharSequence constraint, final FilterResults filterResults) { 
      synchronized (filterResults) { 

       mActivity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if (filterResults != null && filterResults.count >= 0) { 
          mResultList = resultList; 
          notifyDataSetChanged(); 
         } else { 
          notifyDataSetInvalidated(); 
         } 
        } 
       }); 

      } 

     } 
    }; 

    return filter; 
} 

這就是我添加到AutocompletePredictionBuffer :

private ArrayList<PlaceAutocomplete> getAutocomplete(CharSequence constraint) { 

    if (mGoogleApiClient.isConnected()) { 

     PendingResult<AutocompletePredictionBuffer> results = 
       Places.GeoDataApi.getAutocompletePredictions(mGoogleApiClient, constraint.toString(), 
         mBounds, mPlaceFilter); 


     AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS); 
     final Status status = autocompletePredictions.getStatus(); 

     if (!status.isSuccess()) { 
      if (!mGoogleApiClient.isConnected()) { 
       mGoogleApiClient.connect(); 
      } 
      autocompletePredictions.release(); 

      return new ArrayList<>(); 
     } 
相關問題