0

I am building an android application where I am using AutoComplete text to show the search of google place name. Now the problem I am facing is if I enter space between 2 words, it stops displaying any results.

For Ex. - On writing the text "new" it will suggest me "new dehli", "new zealand" etc., when I use a space after the word "new", it stops displaying any result. I have tried couple of things along with: - input = input.replaceAll(" ","%20");

After debugging, I checked that the results are coming but they are not adding in my simple list using adapter. But it looks like the simple list adapter is not adding the space character and there by not displaying the result.

Here is the code -

  1. oncreateview -

    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());
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub              
        }
    });
    
      /** A method to download json data from url */
      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<String, Void, String>{
    
    @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=AIzaSyC3qD9x9SbFGgK69xGtmyieAKaS0kMcpLE";
    
        String input="";
    
    
    
        try {
            input = "input=" + URLEncoder.encode(place[0], "utf-8");
            input = input.replaceAll(" ", "%20");
        } 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+"&"+types+"&"+sensor+"&"+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 web service in background
            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<String, Integer, 
      List<HashMap<String,String>>>{
    
    JSONObject jObject;
    
    @Override
    protected List<HashMap<String, String>> doInBackground(String...   
    jsonData) {         
    
        List<HashMap<String, String>> 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<HashMap<String, String>> 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);             
    
            Toast.makeText(getApplicationContext(), placesTask+"", 
                       Toast.LENGTH_LONG).show();
    
            // Setting the adapter
            atvPlaces.setAdapter(adapter);
    }           
    }    
    

Here is placejson code -

public class PlaceJSONParser {

/**
 * Receives a JSONObject and returns a list
 */
public List<HashMap<String, String>> 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<HashMap<String, String>> getPlaces(JSONArray jPlaces) {
    int placesCount = jPlaces.length();
    List<HashMap<String, String>> placesList = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> place = null;

    /** Taking each place, parses and adds to list object */
    for (int i = 0; i < 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<String, String> getPlace(JSONObject jPlace) {

    HashMap<String, String> place = new HashMap<String, String>();

    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;
}
}

Help is appreciated.

sof question
  • 93
  • 2
  • 13

1 Answers1

1

Fix your Parser task with this:

        @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        String[] from = new String[] {"description"};
        int[] to = new int[] { android.R.id.text1 };

        SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, result,
                android.R.layout.simple_list_item_1, from, to);
        atvPlaces.setAdapter(adapter);
        atvPlaces.performValidation();
        atvPlaces.showDropDown();
    }
}

It forces the AutoCompleteTextView to update the suggestions.

dev.bmax
  • 8,998
  • 3
  • 30
  • 41
  • Dev.bmax there is an small bug is that. When I click on the suggested name of the list it should hide but right now It is not. could you help me in that – sof question Mar 10 '15 at 14:13
  • 1
    This should be a separate question :) – dev.bmax Mar 10 '15 at 14:19
  • dev.bamx It will be very helpful for me please can you help here only for this problem – sof question Mar 12 '15 at 05:29
  • In onPostExecute() right after atvPlaces.setAdapter(adapter); add this snippet: atvPlaces.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { atvPlaces.setText(result.get(position).get("description")); atvPlaces.dismissDropDown(); } }); – dev.bmax Mar 12 '15 at 08:34
  • I have try this but did not help me! – sof question Mar 12 '15 at 20:05
  • dev.bmax I have post a new question here - http://stackoverflow.com/questions/29072748/how-to-use-dismissdropdown-in-simpleadapter-listview-in-android Please help – sof question Mar 16 '15 at 08:52