如何在简单适配器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 字符并且没有显示结果。
这是代码 -
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 更新建议。
我正在构建一个 android 应用程序,我在其中使用自动完成文本来显示对 google 地名的搜索。现在我面临的问题是,如果我在 2 个单词之间输入 space,它将停止显示任何结果。
例如。 - 在写文本 "new" 时,它会提示我 "new dehli"、"new zealand" 等,当我在单词 "new" 后使用 space 时,它会停止显示任何内容结果。我尝试了几件事: - 输入 = input.replaceAll(" ","%20");
调试后,我检查结果出来了,但它们没有使用适配器添加到我的简单列表中。但是看起来简单的列表适配器没有添加 space 字符并且没有显示结果。
这是代码 -
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 更新建议。