title: Auto complete in search places in maps activity
body: <p>Hi im following this tutorial <a href="http://wptrafficanalyzer.in/blog/android-autocompletetextview-with-google-places-autocomplete-api/" rel="nofollow">http://wptrafficanalyzer.in/blog/android-autocompletetextview-with-google-places-autocomplete-api/</a></p>
  
  <p>MapsActivity.java</p>
  
  <pre><code>public class MapsActivity extends FragmentActivity {
  
  private GoogleMap mMap; // Might be null if Google Play services APK is not available.
  AutoCompleteTextView atvPlaces;
  PlacesTask placesTask;
  ParserTask parserTask;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_maps);
      atvPlaces = (AutoCompleteTextView) findViewById(R.id.atv_places);
      atvPlaces.setThreshold(1);
  
      atvPlaces.addTextChangedListener(new TextWatcher() {
  
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {
              placesTask = new PlacesTask();
              placesTask.execute(s.toString());
          }
  
          public void beforeTextChanged(CharSequence s, int start, int count,
                                        int after) {
              // TODO Auto-generated method stub
          }
  
          public void afterTextChanged(Editable s) {
              // TODO Auto-generated method stub
          }
      });
      atvPlaces.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              atvPlaces.showDropDown();
              return false;
          }
      });
      setUpMapIfNeeded();
  }
  private String downloadUrl(String strUrl) throws IOException{
      String data = "";
      InputStream iStream = null;
      HttpURLConnection urlConnection = null;
      try{
          URL url = new URL(strUrl);
  
          // Creating an http connection to communicate with url
          urlConnection = (HttpURLConnection) url.openConnection();
  
          // Connecting to url
          urlConnection.connect();
  
          // Reading data from url
          iStream = urlConnection.getInputStream();
  
          BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
  
          StringBuffer sb = new StringBuffer();
  
          String line = "";
          while( ( line = br.readLine()) != null){
              sb.append(line);
          }
  
          data = sb.toString();
  
          br.close();
  
      }catch(Exception e){
          Log.d("Exception while downloading url", e.toString());
      }finally{
          iStream.close();
          urlConnection.disconnect();
      }
      return data;
  }
  
  // Fetches all places from GooglePlaces AutoComplete Web Service
  private class PlacesTask extends AsyncTask&lt;String, Void, String&gt;{
  
      @Override
      protected String doInBackground(String... place) {
          // For storing data from web service
          String data = "";
  
          // Obtain browser key from https://code.google.com/apis/console
          String key = "key=My Browser Key";
  
          String input="";
  
          try {
              input = "input=" + URLEncoder.encode(place[0], "utf-8");
          } catch (UnsupportedEncodingException e1) {
              e1.printStackTrace();
          }
  
          // place type to be searched
          String types = "types=geocode";
  
          // Sensor enabled
          String sensor = "sensor=false";
  
          // Building the parameters to the web service
          String parameters = input+"&amp;"+types+"&amp;"+sensor+"&amp;"+key;
  
          // Output format
          String output = "json";
  
          // Building the url to the web service
          String url = "https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters;
  
          try{
              // Fetching the data from we service
              data = downloadUrl(url);
          }catch(Exception e){
              Log.d("Background Task",e.toString());
          }
          return data;
      }
  
      @Override
      protected void onPostExecute(String result) {
          super.onPostExecute(result);
  
          // Creating ParserTask
          parserTask = new ParserTask();
  
          // Starting Parsing the JSON string returned by Web Service
          parserTask.execute(result);
      }
  }
  /** A class to parse the Google Places in JSON format */
  private class ParserTask extends AsyncTask&lt;String, Integer, List&lt;HashMap&lt;String,String&gt;&gt;&gt;{
  
      JSONObject jObject;
  
      @Override
      protected List&lt;HashMap&lt;String, String&gt;&gt; doInBackground(String... jsonData) {
  
          List&lt;HashMap&lt;String, String&gt;&gt; places = null;
  
          PlaceJSONParser placeJsonParser = new PlaceJSONParser();
  
          try{
              jObject = new JSONObject(jsonData[0]);
  
              // Getting the parsed data as a List construct
              places = placeJsonParser.parse(jObject);
  
          }catch(Exception e){
              Log.d("Exception",e.toString());
          }
          return places;
      }
  
      @Override
      protected void onPostExecute(List&lt;HashMap&lt;String, String&gt;&gt; result) {
  
          String[] from = new String[] { "description"};
          int[] to = new int[] { android.R.id.text1 };
  
          // Creating a SimpleAdapter for the AutoCompleteTextView
          SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, from, to);
  
          // Setting the adapter
          atvPlaces.setAdapter(adapter);
      }
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
  }
  @Override
  protected void onResume() {
      super.onResume();
      setUpMapIfNeeded();
  }
  
  
  public void onSearch(View view){
      String location = atvPlaces.getText().toString();
  
      List&lt;Address&gt; addressList = null;
  
      if(location!=null || location.equals("")){
  
          Geocoder geocoder = new Geocoder(this);
          try {
              addressList = geocoder.getFromLocationName(location, 1);
          } catch (IOException e) {
              e.printStackTrace();
          }
  
          Address address = addressList.get(0);
          LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
          mMap.addMarker(new MarkerOptions().position(latLng).title("Marker"));
          mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
      }
  }
  
  public void changeType(View view){
      if(mMap.getMapType() == GoogleMap.MAP_TYPE_NORMAL){
          mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
      }
      else{
          mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
      }
  }
  
  private void setUpMapIfNeeded() {
      // Do a null check to confirm that we have not already instantiated the map.
      if (mMap == null) {
          // Try to obtain the map from the SupportMapFragment.
          mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                  .getMap();
          // Check if we were successful in obtaining the map.
          if (mMap != null) {
              setUpMap();
          }
      }
  }
  
  private void setUpMap() {
      mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
      mMap.setMyLocationEnabled(true);
  }
  }
  </code></pre>
  
  <p>CustomAutoCompleteTextView.java</p>
  
  <pre><code>public class CustomAutoCompleteTextView extends AutoCompleteTextView {
  
  public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
  }
  
  /** Returns the place description corresponding to the selected item */
  @Override
  protected CharSequence convertSelectionToString(Object selectedItem) {
      /** Each item in the autocompetetextview suggestion list is a hashmap object */
      HashMap&lt;String, String&gt; hm = (HashMap&lt;String, String&gt;) selectedItem;
      return hm.get("description");
  }
  }
  </code></pre>
  
  <p>PlaceJSONParser.java</p>
  
  <pre><code>public class PlaceJSONParser {
  
  /** Receives a JSONObject and returns a list */
  public List&lt;HashMap&lt;String,String&gt;&gt; parse(JSONObject jObject){
  
      JSONArray jPlaces = null;
      try {
          /** Retrieves all the elements in the 'places' array */
          jPlaces = jObject.getJSONArray("predictions");
      } catch (JSONException e) {
          e.printStackTrace();
      }
      /** Invoking getPlaces with the array of json object
       * where each json object represent a place
       */
      return getPlaces(jPlaces);
  }
  
  private List&lt;HashMap&lt;String, String&gt;&gt; getPlaces(JSONArray jPlaces){
      int placesCount = jPlaces.length();
      List&lt;HashMap&lt;String, String&gt;&gt; placesList = new ArrayList&lt;HashMap&lt;String,String&gt;&gt;();
      HashMap&lt;String, String&gt; place = null;
  
      /** Taking each place, parses and adds to list object */
      for(int i=0; i&lt;placesCount;i++){
          try {
              /** Call getPlace with place JSON object to parse the place */
              place = getPlace((JSONObject)jPlaces.get(i));
              placesList.add(place);
  
          } catch (JSONException e) {
              e.printStackTrace();
          }
      }
  
      return placesList;
  }
  
  /** Parsing the Place JSON object */
  private HashMap&lt;String, String&gt; getPlace(JSONObject jPlace){
  
      HashMap&lt;String, String&gt; place = new HashMap&lt;String, String&gt;();
  
      String id="";
      String reference="";
      String description="";
  
      try {
  
          description = jPlace.getString("description");
          id = jPlace.getString("id");
          reference = jPlace.getString("reference");
  
          place.put("description", description);
          place.put("_id",id);
          place.put("reference",reference);
  
      } catch (JSONException e) {
          e.printStackTrace();
      }
      return place;
  }
  }
  </code></pre>
  
  <p>activity_maps.xml</p>
  
  <pre><code>&lt;LinearLayout
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"&gt;
  
  &lt;LinearLayout
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"&gt;
  
      &lt;AutoCompleteTextView
          android:id="@+id/atv_places"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentTop="true"
          android:hint="@string/str_atv_places" /&gt;
  
      &lt;Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Search"
      android:id="@+id/Bsearch"
      android:layout_gravity="right"
      android:onClick="onSearch"/&gt;
  
      &lt;Button
          style="?android:attr/buttonStyleSmall"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Map Type"
          android:id="@+id/Btype"
          android:layout_gravity="right"
          android:onClick="changeType" /&gt;
  &lt;/LinearLayout&gt;
  
  &lt;LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"&gt;
  
  
  &lt;fragment xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools" android:layout_width="387dp"
  android:layout_height="626dp" android:id="@+id/map"
  tools:context="com.example.group.taxisafe.MapsActivity"
  android:name="com.google.android.gms.maps.SupportMapFragment" /&gt;
  &lt;/LinearLayout&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>My problem is, whenever i click on the autocomplete it throws JSON format. how to parse it and how I can automatically direct the user to that location if they click that autocomplete location. </p>