java - Android Google Places: Not returning selected place -
followed tutorial here. http://www.startingandroid.com/google-places-api-tutorial-for-android/
however, when searching in search bar, selecting 1 suggested list, pressing pick location button, map displays user's current location , not place he/she selected. can provide solution this?
mainactivity.java
public class mainactivity extends appcompatactivity { private placepicker.intentbuilder builder; private placesautocompleteadapter mplacesadapter; private button pickerbtn; private autocompletetextview mylocation; private static final int place_picker_flag = 1; private static final latlngbounds bounds_greater_sydney = new latlngbounds( new latlng(-34.041458, 150.790100), new latlng(-33.682247, 151.383362)); protected googleapiclient mgoogleapiclient; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mgoogleapiclient = new googleapiclient.builder(this) .addapi(places.geo_data_api) .build(); setcontentview(r.layout.activity_main); builder = new placepicker.intentbuilder(); mylocation = (autocompletetextview) findviewbyid(r.id.mylocation); mplacesadapter = new placesautocompleteadapter(this, android.r.layout.simple_list_item_1, mgoogleapiclient, bounds_greater_sydney, null); mylocation.setonitemclicklistener(mautocompleteclicklistener); mylocation.setadapter(mplacesadapter); pickerbtn = (button) findviewbyid(r.id.pickerbtn); pickerbtn.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { try { builder = new placepicker.intentbuilder(); intent intent = builder.build(mainactivity.this); // start intent requesting result, identified request code. startactivityforresult(intent, place_picker_flag); } catch (googleplayservicesrepairableexception e) { googleplayservicesutil .geterrordialog(e.getconnectionstatuscode(), mainactivity.this, 0); } catch (googleplayservicesnotavailableexception e) { toast.maketext(mainactivity.this, "google play services not available.", toast.length_long) .show(); } } }); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (resultcode == result_ok) { switch (requestcode) { case place_picker_flag: place place = placepicker.getplace(this, data); mylocation.settext(place.getname() + ", " + place.getaddress()); break; } } } // ahh @override protected void onstart() { super.onstart(); mgoogleapiclient.connect(); } @override protected void onstop() { mgoogleapiclient.disconnect(); super.onstop(); } private adapterview.onitemclicklistener mautocompleteclicklistener = new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { final placesautocompleteadapter.placeautocomplete item = mplacesadapter.getitem(position); final string placeid = string.valueof(item.placeid); pendingresult<placebuffer> placeresult = places.geodataapi .getplacebyid(mgoogleapiclient, placeid); placeresult.setresultcallback(mupdateplacedetailscallback); } }; private resultcallback<placebuffer> mupdateplacedetailscallback = new resultcallback<placebuffer>() { @override public void onresult(placebuffer places) { if (!places.getstatus().issuccess()) { log.e("place", "place query did not complete. error: " + places.getstatus().tostring()); return; } // selecting first object buffer. final place place = places.get(0); } }; }
placesautocompleteadapter.java
public class placesautocompleteadapter extends arrayadapter<placesautocompleteadapter.placeautocomplete> implements filterable { private static final string tag = "placeautocomplete"; /** * current results returned adapter. */ private arraylist<placeautocomplete> mresultlist; /** * handles autocomplete requests. */ private googleapiclient mgoogleapiclient; /** * bounds used places geo data autocomplete api requests. */ private latlngbounds mbounds; /** * autocomplete filter used restrict queries specific set of place types. */ private autocompletefilter mplacefilter; /** * initializes resource text rows , autocomplete query bounds. * * @see arrayadapter#arrayadapter(context, int) */ public placesautocompleteadapter(context context, int resource, googleapiclient googleapiclient, latlngbounds bounds, autocompletefilter filter) { super(context, resource); mgoogleapiclient = googleapiclient; mbounds = bounds; mplacefilter = filter; } /** * sets bounds subsequent queries. */ public void setbounds(latlngbounds bounds) { mbounds = bounds; } /** * returns number of results received in last autocomplete query. */ @override public int getcount() { return mresultlist.size(); } /** * returns item last autocomplete query. */ @override public placeautocomplete getitem(int position) { return mresultlist.get(position); } /** * returns filter current set of autocomplete results. */ @override public filter getfilter() { filter filter = new filter() { @override protected filterresults performfiltering(charsequence constraint) { filterresults results = new filterresults(); // skip autocomplete query if no constraints given. if (constraint != null) { // query autocomplete api (constraint) search string. mresultlist = getautocomplete(constraint); if (mresultlist != null) { // api returned results. results.values = mresultlist; results.count = mresultlist.size(); } } return results; } @override protected void publishresults(charsequence constraint, filterresults results) { if (results != null && results.count > 0) { // api returned @ least 1 result, update data. notifydatasetchanged(); } else { // api did not return results, invalidate data set. notifydatasetinvalidated(); } } }; return filter; } private arraylist<placeautocomplete> getautocomplete(charsequence constraint) { if (mgoogleapiclient.isconnected()) { log.i(tag, "starting autocomplete query for: " + constraint); // submit query autocomplete api , retrieve pendingresult // contain results when query completes. pendingresult<autocompletepredictionbuffer> results = places.geodataapi .getautocompletepredictions(mgoogleapiclient, constraint.tostring(), mbounds, mplacefilter); // method should have been called off main ui thread. block , wait @ 60s // result api. autocompletepredictionbuffer autocompletepredictions = results .await(60, timeunit.seconds); // confirm query completed successfully, otherwise return null final status status = autocompletepredictions.getstatus(); if (!status.issuccess()) { toast.maketext(getcontext(), "error contacting api: " + status.tostring(), toast.length_short).show(); log.e(tag, "error getting autocomplete prediction api call: " + status.tostring()); autocompletepredictions.release(); return null; } log.i(tag, "query completed. received " + autocompletepredictions.getcount() + " predictions."); // copy results our own data structure, because can't hold onto buffer. // autocompleteprediction objects encapsulate api response (place id , description). iterator<autocompleteprediction> iterator = autocompletepredictions.iterator(); arraylist resultlist = new arraylist<>(autocompletepredictions.getcount()); while (iterator.hasnext()) { autocompleteprediction prediction = iterator.next(); // details of prediction , copy new placeautocomplete object. resultlist.add(new placeautocomplete(prediction.getplaceid(), prediction.getfulltext(null))); } // release buffer data has been copied. autocompletepredictions.release(); return resultlist; } log.e(tag, "google api client not connected autocomplete query."); return null; } /** * holder places geo data autocomplete api results. */ public class placeautocomplete { public charsequence placeid; public charsequence description; placeautocomplete(charsequence placeid, charsequence description) { this.placeid = placeid; this.description = description; } @override public string tostring() { return description.tostring(); } } }
Comments
Post a Comment