
build.gradle(模块:应用)
implementation 'com.google.android.gms:play-services-maps:17.0.0'implementation 'com.google.android.gms:play-services-location:17.0.0'implementation 'com.google.android.gms:play-services-places:17.0.0'implementation 'com.google.android.libraries.places:places:1.1.0'
活动布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:padding="15dp" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity.MapsActivity"> <EditText android:id="@+id/place_search" android:hint="Search" android:inputType="textPostalAddress" android:padding="15dp" android:layout_marginBottom="15dp" android:drawableLeft="@drawable/places_ic_search" android:background="@drawable/edit_text_border" android:layout_width="match_parent" android:layout_height="wrap_content" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/places_recycler_view" android:background="#FFF" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="wrap_content"> </androidx.recyclerview.widget.RecyclerView></LinearLayout>
活动
import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.google.android.libraries.places.api.Places;import com.google.android.libraries.places.api.model.Place;import com.zaaibo.drive.R;import com.zaaibo.drive.adapter.PlacesAutoCompleteAdapter;public class MapsActivity extends AppCompatActivity implements PlacesAutoCompleteAdapter.ClickListener{ private PlacesAutoCompleteAdapter mAutoCompleteAdapter; private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); Places.initialize(this, getResources().getString(R.string.google_maps_key)); recyclerView = (RecyclerView) findViewById(R.id.places_recycler_view); ((EditText) findViewById(R.id.place_search)).addTextChangedListener(filterTextWatcher); mAutoCompleteAdapter = new PlacesAutoCompleteAdapter(this); recyclerView.setLayoutManager(new LinearLayoutManager(this)); mAutoCompleteAdapter.setClickListener(this); recyclerView.setAdapter(mAutoCompleteAdapter); mAutoCompleteAdapter.notifyDataSetChanged(); } private TextWatcher filterTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { if (!s.toString().equals("")) { mAutoCompleteAdapter.getFilter().filter(s.toString()); if (recyclerView.getVisibility() == View.GONE) {recyclerView.setVisibility(View.VISIBLE);} } else { if (recyclerView.getVisibility() == View.VISIBLE) {recyclerView.setVisibility(View.GONE);} } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } }; @Override public void click(Place place) { Toast.makeText(this, place.getAddress()+", "+place.getLatLng().latitude+place.getLatLng().longitude, Toast.LENGTH_SHORT).show(); }}适配器
import android.content.Context;import android.graphics.Typeface;import android.text.style.CharacterStyle;import android.text.style.StyleSpan;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Filter;import android.widget.Filterable;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.recyclerview.widget.RecyclerView;import com.google.android.gms.common.api.ApiException;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.android.gms.tasks.Tasks;import com.google.android.libraries.places.api.model.AutocompletePrediction;import com.google.android.libraries.places.api.model.AutocompleteSessionToken;import com.google.android.libraries.places.api.model.Place;import com.google.android.libraries.places.api.net.FetchPlaceRequest;import com.google.android.libraries.places.api.net.FetchPlaceResponse;import com.google.android.libraries.places.api.net.FindAutocompletePredictionsRequest;import com.google.android.libraries.places.api.net.FindAutocompletePredictionsResponse;import com.google.android.libraries.places.api.net.PlacesClient;import com.zaaibo.drive.R;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException;public class PlacesAutoCompleteAdapter extends RecyclerView.Adapter<PlacesAutoCompleteAdapter.PredictionHolder> implements Filterable { private static final String TAG = "PlacesAutoAdapter"; private ArrayList<PlaceAutocomplete> mResultList = new ArrayList<>(); private Context mContext; private CharacterStyle STYLE_BOLD; private CharacterStyle STYLE_NORMAL; private final PlacesClient placesClient; private ClickListener clickListener; public PlacesAutoCompleteAdapter(Context context) { mContext = context; STYLE_BOLD = new StyleSpan(Typeface.BOLD); STYLE_NORMAL = new StyleSpan(Typeface.NORMAL); placesClient = com.google.android.libraries.places.api.Places.createClient(context); } public void setClickListener(ClickListener clickListener) { this.clickListener = clickListener; } public interface ClickListener { void click(Place place); } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Skip the autocomplete query if no constraints are given. if (constraint != null) { // Query the autocomplete API for the (constraint) search string. mResultList = getPredictions(constraint); if (mResultList != null) { // The API successfully 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) { // The API returned at least one result, update the data. notifyDataSetChanged(); } else { // The API did not return any results, invalidate the data set. //notifyDataSetInvalidated(); } } }; } private ArrayList<PlaceAutocomplete> getPredictions(CharSequence constraint) { final ArrayList<PlaceAutocomplete> resultList = new ArrayList<>(); // Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); //https://gist.github.com/graydon/11198540 // Use the builder to create a FindAutocompletePredictionsRequest. FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). //.setLocationBias(bounds) //.setCountry("BD") //.setTypeFilter(TypeFilter.ADDRESS) .setSessionToken(token) .setQuery(constraint.toString()) .build(); Task<FindAutocompletePredictionsResponse> autocompletePredictions = placesClient.findAutocompletePredictions(request); // This method should have been called off the main UI thread. Block and wait for at most // 60s for a result from the API. try { Tasks.await(autocompletePredictions, 60, TimeUnit.SECONDS); } catch (ExecutionException | InterruptedException | TimeoutException e) { e.printStackTrace(); } if (autocompletePredictions.isSuccessful()) { FindAutocompletePredictionsResponse findAutocompletePredictionsResponse = autocompletePredictions.getResult(); if (findAutocompletePredictionsResponse != null) for (AutocompletePrediction prediction : findAutocompletePredictionsResponse.getAutocompletePredictions()) { Log.i(TAG, prediction.getPlaceId()); resultList.add(new PlaceAutocomplete(prediction.getPlaceId(), prediction.getPrimaryText(STYLE_NORMAL).toString(), prediction.getFullText(STYLE_BOLD).toString())); } return resultList; } else { return resultList; } } @NonNull @Override public PredictionHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View convertView = layoutInflater.inflate(R.layout.place_recycler_item_layout, viewGroup, false); return new PredictionHolder(convertView); } @Override public void onBindViewHolder(@NonNull PredictionHolder mPredictionHolder, final int i) { mPredictionHolder.address.setText(mResultList.get(i).address); mPredictionHolder.area.setText(mResultList.get(i).area); } @Override public int getItemCount() { return mResultList.size(); } public PlaceAutocomplete getItem(int position) { return mResultList.get(position); } public class PredictionHolder extends RecyclerView.ViewHolder implements View.onClickListener { private TextView address, area; private LinearLayout mRow; PredictionHolder(View itemView) { super(itemView); area = itemView.findViewById(R.id.place_area); address = itemView.findViewById(R.id.place_address); mRow = itemView.findViewById(R.id.place_item_view); itemView.setonClickListener(this); } @Override public void onClick(View v) { PlaceAutocomplete item = mResultList.get(getAdapterPosition()); if (v.getId() == R.id.place_item_view) { String placeId = String.valueOf(item.placeId); List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG, Place.Field.ADDRESS); FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields).build(); placesClient.fetchPlace(request).addonSuccessListener(new OnSuccessListener<FetchPlaceResponse>() { @Override public void onSuccess(FetchPlaceResponse response) { Place place = response.getPlace(); clickListener.click(place); } }).addonFailureListener(new onFailureListener() { @Override public void onFailure(@NonNull Exception exception) { if (exception instanceof ApiException) { Toast.makeText(mContext, exception.getMessage() + "", Toast.LENGTH_SHORT).show(); } } }); } } } public class PlaceAutocomplete { public CharSequence placeId; public CharSequence address, area; PlaceAutocomplete(CharSequence placeId, CharSequence area, CharSequence address) { this.placeId = placeId; this.area = area; this.address = address; } @Override public String toString() { return area.toString(); } }}欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)