2016-03-22 20 views
0

我想創建一個搜索框,像用戶輸入地址/位置的Uber,但我希望autoComplete只能在一個國家預測地址,如印度。如何限制Google將自動完成結果僅限於指定的國家/地區?

自動完成Adaptar

ArrayAdapter<AutocompletePrediction> implements Filterable { 


private static final String TAG = "PlaceAutoComAdapter"; 
private static final CharacterStyle STYLE_BOLD = new StyleSpan(Typeface.BOLD); 
/** 
* Current results returned by this adapter. 
*/ 
private ArrayList<AutocompletePrediction> mResultList; 

/** 
* Handles autocomplete requests. 
*/ 
private GoogleApiClient mGoogleApiClient; 

/** 
* The bounds used for Places Geo Data autocomplete API requests. 
*/ 
private LatLngBounds mBounds; 

/** 
* The autocomplete filter used to restrict queries to a specific set of place types. 
*/ 
private AutocompleteFilter mPlaceFilter; 

/** 
* Initializes with a resource for text rows and autocomplete query bounds. 
* 
* @see ArrayAdapter#ArrayAdapter(Context, int) 
*/ 
public PlaceAutocompleteAdapter(Context context, GoogleApiClient googleApiClient, 
           LatLngBounds bounds, AutocompleteFilter filter) { 
    super(context, android.R.layout.simple_list_item_1,android.R.id.text1); 
    mGoogleApiClient = googleApiClient; 
    mBounds = bounds; 
    mPlaceFilter = filter; 
} 

/** 
* Sets the bounds for all subsequent queries. 
*/ 
public void setBounds(LatLngBounds bounds) { 

    mBounds = bounds; 
} 

/** 
* Returns the number of results received in the last autocomplete query. 
*/ 
@Override 
public int getCount() { 
    if (mResultList!=null) 
    return mResultList.size(); 
    else 
     return 0; 
} 

/** 
* Returns an item from the last autocomplete query. 
*/ 
@Override 
public AutocompletePrediction getItem(int position) { 
    return mResultList.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = super.getView(position, convertView, parent); 

    // Sets the primary and secondary text for a row. 
    // Note that getPrimaryText() and getSecondaryText() return a CharSequence that may contain 
    // styling based on the given CharacterStyle. 

    AutocompletePrediction item = getItem(position); 

    TextView textView1 = (TextView) row.findViewById(android.R.id.text1); 
    //TextView textView2 = (TextView) row.findViewById(android.R.id.text2); 
    textView1.setText(item.getDescription()); 
    textView1.setTag(item); 
    //textView2.setText(item.getDescription()); 

    return row; 
} 

/** 
* Returns the filter for the current set of autocomplete results. 
*/ 
@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      // Skip the autocomplete query if no constraints are given. 
      if (constraint != null) { 
       // Query the autocomplete API for the (constraint) search string. 
       mResultList = getAutocomplete(constraint); 
       if (mResultList != null) { 
        // The API successfully returned results. 
        results.values = mResultList; 
        results.count = mResultList.size(); 
       } 
      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results != null && results.count > 0) { 
       // The API returned at least one result, update the data. 
       notifyDataSetChanged(); 
      } else { 
       // The API did not return any results, invalidate the data set. 
       notifyDataSetInvalidated(); 
      } 
     } 

     @Override 
     public CharSequence convertResultToString(Object resultValue) { 
      // Override this method to display a readable result in the AutocompleteTextView 
      // when clicked. 
      if (resultValue instanceof AutocompletePrediction) { 
       return ((AutocompletePrediction) resultValue).getDescription(); 
      } else { 
       return super.convertResultToString(resultValue); 
      } 
     } 
    }; 
} 

/** 
* Submits an autocomplete query to the Places Geo Data Autocomplete API. 
* Results are returned as frozen AutocompletePrediction objects, ready to be cached. 
* objects to store the Place ID and description that the API returns. 
* Returns an empty list if no results were found. 
* Returns null if the API client is not available or the query did not complete 
* successfully. 
* This method MUST be called off the main UI thread, as it will block until data is returned 
* from the API, which may include a network request. 
* 
* @param constraint Autocomplete query string 
* @return Results from the autocomplete API or null if the query was not successful. 
* @see Places#GEO_DATA_API#getAutocomplete(CharSequence) 
* @see AutocompletePrediction#freeze() 
*/ 
private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) { 
    if (mGoogleApiClient.isConnected()) { 
     Log.i(TAG, "Starting autocomplete query for: " + constraint); 

     // Submit the query to the autocomplete API and retrieve a PendingResult that will 
     // contain the results when the query completes. 
     PendingResult<AutocompletePredictionBuffer> results = 
       Places.GeoDataApi 
         .getAutocompletePredictions(mGoogleApiClient, constraint.toString(), 
           mBounds, mPlaceFilter); 

     // This method should have been called off the main UI thread. Block and wait for at most 60s 
     // for a result from the API. 
     AutocompletePredictionBuffer autocompletePredictions = results 
       .await(60, TimeUnit.SECONDS); 

     // Confirm that the query completed successfully, otherwise return null 
     final Status status = autocompletePredictions.getStatus(); 
     if (!status.isSuccess()) { 
      /* Toast.makeText(getContext(), "Error contacting API: " + status.toString(), 
        Toast.LENGTH_SHORT).show();*/ 
      Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString()); 
      autocompletePredictions.release(); 
      return null; 
     } 

     Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount() 
       + " predictions."); 

     // Freeze the results immutable representation that can be stored safely. 
     return DataBufferUtils.freezeAndClose(autocompletePredictions); 
    } 
    Log.e(TAG, "Google API client is not connected for autocomplete query."); 
    return null; 
} 

} 

回答

0

設置過濾器並使用它作爲你的自動完成查詢的一部分

filter.country = "In" 
相關問題