How do I get a search suggestion from Google Places?

I need to have a list of suggestions cities/streets/villages while I type in the search bar. I found out that I need to implement contentProvider , and I do it. Now, for everything I type, I get the same result:

"Search results"

While Google Places should return the correct list of places. Can anybody help me? How can I do my search work since it works on googlemaps? (I mean the suggestions, the Geocoder material is already done). Thank you very much

+4
source share
1 answer

Here is a piece of code that I used when I have a similar problem.

here is my PlacesAutoCompleteAdapter .java file.

 package com.inukshk.adapter; import java.util.ArrayList; import android.content.Context; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.Filterable; import com.inukshk.CreateInukshk.CreateInukshk; public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { private ArrayList<String> resultList; public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } @Override public int getCount() { return resultList.size(); } @Override public String getItem(int index) { return resultList.get(index); } @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint != null) { // Retrieve the autocomplete results. resultList = CreateInukshk.autocomplete(constraint .toString()); // Assign the data to the FilterResults filterResults.values = resultList; filterResults.count = resultList.size(); } return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results != null && results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } }; return filter; } } 

here is what you need to do inside OnCreate () of your activity.

 autoCompView = (AutoCompleteTextView) findViewById(R.id.editloc); autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.list_item)); 

here are the static lines that I used in the application.

 private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; private static final String OUT_JSON = "/json"; private static final String API_KEY = "YOUR API KEY"; 

And finally, here is the method you will use in the Adapter.

 public static 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("?sensor=false&key=" + API_KEY); // sb.append("&components=country:uk"); sb.append("&input=" + URLEncoder.encode(input, "utf8")); URL url = new URL(sb.toString()); conn = (HttpURLConnection) url.openConnection(); InputStreamReader in = new InputStreamReader(conn.getInputStream()); // Load the results into a StringBuilder int read; char[] buff = new char[1024]; while ((read = in.read(buff)) != -1) { jsonResults.append(buff, 0, read); } } catch (MalformedURLException e) { Log.e(TAG, "Error processing Places API URL", e); return resultList; } catch (IOException e) { Log.e(TAG, "Error connecting to Places API", e); return resultList; } finally { if (conn != null) { conn.disconnect(); } } try { // Create a JSON object hierarchy from the results JSONObject jsonObj = new JSONObject(jsonResults.toString()); JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); // Extract the Place descriptions from the results resultList = new ArrayList<String>(predsJsonArray.length()); for (int i = 0; i < predsJsonArray.length(); i++) { resultList.add(predsJsonArray.getJSONObject(i).getString( "description")); } } catch (JSONException e) { Log.e(TAG, "Cannot process JSON results", e); } return resultList; } 

I think you specified list_item.xml as shown below.

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

try it. Hope this helps you.

+5
source

Source: https://habr.com/ru/post/1447747/


All Articles