Dit zou vrij eenvoudig moeten zijn, toch kan ik niet zien wat/hoe iets Null zou kunnen zijn.
Ik heb geprobeerd een AutoCompleteTextView te hebben met resultaat van Google places api.
Ik kan zien dat het maken van mijn URL's correct is, ik krijg resultaten van Google, maar wanneer het resultaat wordt doorgegeven aan de tekstView, crasht alles.
XML-indeling - places_search.xml:
<?xml version="1.0" encoding="utf-8"?>
XML-indeling voor TextView:
<?xml version="1.0" encoding="utf-8"?>
En hieronder vindt u de volledige code die zoekt naar resultaten voor automatisch aanvullen van Google plaatst api.
public class PlacesListSearchActivity extends Activity {
private static final String TAG = "PlacesListActivity";
private ResultReceiver mReceiver;
private OnSharedPreferenceChangeListener sharedPreferencesListener;
private SharedPreferences sharedPreferences;
/** Called when the activity is first created. */
public ArrayAdapter adapter;
public AutoCompleteTextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.places_search);
final ArrayAdapter adapter = new ArrayAdapter(this,R.layout.item_list);
final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
adapter.setNotifyOnChange(true);
textView.setHint("type store name");
textView.setAdapter(adapter);
textView.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (count%3 == 1) {
adapter.clear();
GetPlaces task = new GetPlaces();
//now pass the argument in the textview to the task
task.execute(textView.getText().toString());
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
//TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
}
});
}
class GetPlaces extends AsyncTask> {
@Override
//three dots is java for an array of strings
protected ArrayList doInBackground(String... args)
{
Log.d("gottaGo", "doInBackground");
ArrayList predictionsArr = new ArrayList();
try
{
URL googlePlaces = new URL(
"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=" +
URLEncoder.encode(args[0], "UTF-8") +
"&types=geocode&language=en&sensor=true&key=" +
getResources().getString(R.string.googleAPIKey));
Log.d("URL", googlePlaces.toString());
URLConnection tc = googlePlaces.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
tc.getInputStream()));
String line;
StringBuffer sb = new StringBuffer();
//take Google's legible JSON and turn it into one big string.
while ((line = in.readLine()) != null) {
sb.append(line);
}
//turn that string into a JSON object
JSONObject predictions = new JSONObject(sb.toString());
//now get the JSON array that's inside that object
JSONArray ja = new JSONArray(predictions.getString("predictions"));
for (int i = 0; i < ja.length(); i++) {
JSONObject jo = (JSONObject) ja.get(i);
//add each entry to our array
predictionsArr.add(jo.getString("description"));
}
} catch (IOException e)
{
Log.e("YourApp", "GetPlaces : doInBackground", e);
} catch (JSONException e)
{
Log.e("YourApp", "GetPlaces : doInBackground", e);
}
return predictionsArr;
}
//then our post
@Override
protected void onPostExecute(ArrayList result){
Log.d("YourApp", "onPostExecute : " + result.size());
//update the adapter
adapter = new ArrayAdapter(getBaseContext(), R.layout.item_list);
adapter.setNotifyOnChange(true);
//attach the adapter to textview
textView.setAdapter(adapter);
for (String string : result) {
Log.d("YourApp", "onPostExecute : result = " + string);
adapter.add(string);
adapter.notifyDataSetChanged();
}
Log.d("YourApp", "onPostExecute : autoCompleteAdapter" + adapter.getCount());
}
}
}
hieronder is de LOGCAT:
06-24 09:34:41.225: E/AndroidRuntime(10588): FATAL EXCEPTION: main
06-24 09:34:41.225: E/AndroidRuntime(10588): java.lang.NullPointerException
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.rathinavelu.rea.PlacesListSearchActivity$GetPlaces.onPostExecute(PlacesListSearchActivity.java:156)
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.rathinavelu.rea.PlacesListSearchActivity$GetPlaces.onPostExecute(PlacesListSearchActivity.java:1)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask.finish(AsyncTask.java:602)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask.access$600(AsyncTask.java:156)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.Handler.dispatchMessage(Handler.java:99)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.Looper.loop(Looper.java:137)
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.app.ActivityThread.main(ActivityThread.java:4507)
06-24 09:34:41.225: E/AndroidRuntime(10588): at java.lang.reflect.Method.invokeNative(Native Method)
06-24 09:34:41.225: E/AndroidRuntime(10588): at java.lang.reflect.Method.invoke(Method.java:511)
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-24 09:34:41.225: E/AndroidRuntime(10588): at dalvik.system.NativeStart.main(Native Method)
Regel 156 neemt me mee naar deze regel in de code:
textView.setAdapter(adapter);