如何在简单的适配器android中添加多个单词?

时间:2015-03-10 08:53:30

标签: android google-maps autocomplete

我正在构建一个Android应用程序,我使用自动完成文本来显示谷歌地名的搜索。现在我遇到的问题是如果我在两个单词之间输入空格,它就会停止显示任何结果。

对于Ex。 - 撰写文本" new"它会建议我"新的dehli","新西兰"当我在单词" new"之后使用空格时,它会停止显示任何结果。我尝试了几件事: - input = input.replaceAll("","%20");

调试之后,我检查了结果即将到来但是他们没有使用适配器添加到我的简单列表中。但看起来简单的列表适配器没有添加空格字符,并且没有显示结果。

这是代码 -

  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);
    }           
    }    
    
  2. 这是placejson代码 -

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

    非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

使用以下方法修复您的Parser任务:

        @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();
    }
}

它强制AutoCompleteTextView更新建议。