如何以编程方式实现Google Places自动完成

如何以编程方式实现Google Places自动完成,第1张

如何以编程方式实现Google Places自动完成 新版本2019

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();        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5427046.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存