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

How to add multiple words in simple adapter android?

我正在构建一个 android 应用程序,我在其中使用自动完成文本来显示对 google 地名的搜索。现在我面临的问题是,如果我在 2 个单词之间输入 space,它将停止显示任何结果。

例如。 - 在写文本 "new" 时,它会提示我 "new dehli"、"new zealand" 等,当我在单词 "new" 后使用 space 时,它会停止显示任何内容结果。我尝试了几件事: - 输入 = input.replaceAll(" ","%20");

调试后,我检查结果出来了,但它们没有使用适配器添加到我的简单列表中。但是看起来简单的列表适配器没有添加 space 字符并且没​​有显示结果。

这是代码 -

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

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

感谢帮助。

用这个修复你的解析器任务:

        @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 更新建议。