Android:在android位置提供自动autosuggestion Api?

我是非常新的android谷歌地图我写下面的程序来显示android中的自动sugesstion,当我input自动完成文本框中的文本,它是去input的url,但输出不显示在程序中。请看一次,让我知道我在哪里做错了。

ExampleApp.java package com.example.exampleapp; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater.Filter; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Filterable; import android.widget.Toast; public class ExampleApp extends Activity implements OnItemClickListener{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AutoCompleteTextView autoCompView = (AutoCompleteTextView) findViewById(R.id.autocomplete); autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.list_item)); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub String str = (String) arg0.getItemAtPosition(arg2); Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } } class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { private ArrayList<String> resultList; public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; private static final String OUT_JSON = "/json"; private static final String API_KEY = ""; @Override public int getCount() { return resultList.size(); } @Override public String getItem(int index) { return resultList.get(index); } @Override public android.widget.Filter getFilter() { Filter filter = new Filter() { protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint != null) { // Retrieve the autocomplete results. resultList = autocomplete(constraint.toString()); // Assign the data to the FilterResults // filterResults.values = resultList; // filterResults.count = resultList.size(); } return filterResults; } private ArrayList<String> autocomplete(String input) { ArrayList<String> resultList = null; HttpURLConnection conn = null; StringBuilder jsonResults = new StringBuilder(); try { StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); sb.append("?sensor=false&key=" + API_KEY); sb.append("&components=country:uk"); sb.append("&input=" + URLEncoder.encode(input, "utf8")); URL url = new URL(sb.toString()); conn = (HttpURLConnection) url.openConnection(); InputStreamReader in = new InputStreamReader(conn.getInputStream()); // Load the results into a StringBuilder int read; char[] buff = new char[1024]; while ((read = in.read(buff)) != -1) { jsonResults.append(buff, 0, read); } } catch (MalformedURLException e) { // Log.e(LOG_TAG, "Error processing Places API URL", e); return resultList; } catch (IOException e) { //Log.e(LOG_TAG, "Error connecting to Places API", e); return resultList; } finally { if (conn != null) { conn.disconnect(); } } try { // Create a JSON object hierarchy from the results JSONObject jsonObj = new JSONObject(jsonResults.toString()); JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); // Extract the Place descriptions from the results resultList = new ArrayList<String>(predsJsonArray.length()); for (int i = 0; i < predsJsonArray.length(); i++) { resultList.add(predsJsonArray.getJSONObject(i).getString("description")); } } catch (JSONException e) { // Log.e(LOG_TAG, "Cannot process JSON results", e); } return resultList; } protected void publishResults(CharSequence constraint, FilterResults results) { if (results != null) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } @Override public boolean onLoadClass(Class arg0) { // TODO Auto-generated method stub return false; }}; return (android.widget.Filter) filter; } } FilterResults.java package com.example.exampleapp; import java.util.ArrayList; public class FilterResults { protected ArrayList<String> values; protected int count; } i write the above code but the application closed .please see once and let me know where i am doing mistake in the above code ? Thanks in Advance.......... 

Solutions Collecting From Web of "Android:在android位置提供自动autosuggestion Api?"

这里是我有类似问题时使用的代码片段。 我给你一个build议,D'nt把你的整个代码只在单个java文件。 为您在代码中使用的每个不同任务创build单独的方法/类。 它会帮助你更容易地追踪它。

这里是我的PlacesAutoCompleteAdapter.java文件。

 package com.inukshk.adapter; import java.util.ArrayList; import android.content.Context; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.Filterable; import com.inukshk.CreateInukshk.CreateInukshk; public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { private ArrayList<String> resultList; public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } @Override public int getCount() { return resultList.size(); } @Override public String getItem(int index) { return resultList.get(index); } @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint != null) { // Retrieve the autocomplete results. resultList = CreateInukshk.autocomplete(constraint .toString()); // Assign the data to the FilterResults filterResults.values = resultList; filterResults.count = resultList.size(); } return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results != null && results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } }; return filter; } } 

这里是你在你的活动的OnCreate()内所要做的。

 autoCompView = (AutoCompleteTextView) findViewById(R.id.editloc); autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.list_item)); 

这里是我在应用程序中使用的静态string。

 private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; private static final String OUT_JSON = "/json"; private static final String API_KEY = "YOUR API KEY"; 

最后,这里是您将在Adapter中使用的方法。

 public static ArrayList<String> autocomplete(String input) { ArrayList<String> resultList = null; HttpURLConnection conn = null; StringBuilder jsonResults = new StringBuilder(); try { StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); sb.append("?sensor=false&key=" + API_KEY); // sb.append("&components=country:uk"); sb.append("&input=" + URLEncoder.encode(input, "utf8")); URL url = new URL(sb.toString()); conn = (HttpURLConnection) url.openConnection(); InputStreamReader in = new InputStreamReader(conn.getInputStream()); // Load the results into a StringBuilder int read; char[] buff = new char[1024]; while ((read = in.read(buff)) != -1) { jsonResults.append(buff, 0, read); } } catch (MalformedURLException e) { Log.e(TAG, "Error processing Places API URL", e); return resultList; } catch (IOException e) { Log.e(TAG, "Error connecting to Places API", e); return resultList; } finally { if (conn != null) { conn.disconnect(); } } try { // Create a JSON object hierarchy from the results JSONObject jsonObj = new JSONObject(jsonResults.toString()); JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); // Extract the Place descriptions from the results resultList = new ArrayList<String>(predsJsonArray.length()); for (int i = 0; i < predsJsonArray.length(); i++) { resultList.add(predsJsonArray.getJSONObject(i).getString( "description")); } } catch (JSONException e) { Log.e(TAG, "Cannot process JSON results", e); } return resultList; } 

编辑:

我想你已经指定了list_item.xml如下。

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

试试看。 希望它会帮助你。

更新:

 You have to manually attach the debugger while the emulator says "Waiting for debugger to attach". In Netbean's menu bar, click "Debug", then "Attach Debugger...". You have to select your package from the "Process" drop down list, and then click "Attach". That should do it. This works in Netbeans 7 anyway. 

或者你也可以试试下面的东西。

 You have two choices: connect a debugger, or kill the process. Looking at your logcat, you have at least two different desktop applications that are trying to connect to each application process, which is where the "Ignoring second debugger" messages are coming from. This would happen if you were, say, running Eclipse with the ADT plugin, and the stand-alone DDMS at the same time. I don't know what you're running or what the netbeans plugin does, but I would start by figuring out if you have two different things fighting for control. 

编辑: HOW TO GET TEXT OF AutoCompleteTextView

只是写这个代码片段。

 autoCompView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub YOURTEXT = autoCompView.getText().toString(); //new AsyncGetAutoPlace().execute(autoCompView.getText() // .toString().trim()); } });