我正在开发一个android应用程序。这样就可以进行google map
和places
搜索。当我在搜索视图中搜索地点时,我会得到
Peringathur,Kerala, India
Peringavu, Thrissur, Kerala, India
Peringala,Kerala, India
Peringalkuthu Dam, Poringalkuthu, Pariyaram, Kerala, India
Peringandoor, Kerala, India
在这里,我需要从所有行中删除此Kerala, India
Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
ArrayList resultList = new ArrayList<>(autocompletePredictions.getCount());
while (iterator.hasNext()) {
AutocompletePrediction prediction = iterator.next();
String data = (String) prediction.getFullText(null);
resultList.add(new PlaceAutocomplete(prediction.getPlaceId(),
(String) prediction.getPrimaryText(null)+"\n"+
(String) prediction.getSecondaryText(null)
));
答案 0 :(得分:0)
您可以像AutoCompleteTextView
文章中那样使用自定义的this。您可以在填充Task<AutocompletePredictionBufferResponse>
中的protected void publishResults(CharSequence constraint, FilterResults results)
中的位置列表之后,在results.values;
中自定义地名。
因此,对于MainActivity.java
这样:
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
private static final String TAG = MainActivity.class.getSimpleName();
private GoogleMap mGoogleMap;
private SupportMapFragment mMapSupportedFragment;
private AutoCompleteTextView mPlaceAutoCompleteTextView;
private PlacesAdapter mPlacesAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlacesAdapter = new PlacesAdapter(this);
mPlaceAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.place_autocomplete);
mPlaceAutoCompleteTextView.setThreshold(1);
mPlaceAutoCompleteTextView.setAdapter(mPlacesAdapter);
mMapSupportedFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_fragment);
mMapSupportedFragment.getMapAsync(MainActivity.this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
}
class PlacesAdapter extends ArrayAdapter {
Context context;
List<String> placesList = new ArrayList<>();
GeoDataClient geoDataClient;
PlacesAdapter.PlacesAutoCompleteFilter filter = new PlacesAdapter.PlacesAutoCompleteFilter();
public PlacesAdapter(Context context) {
super(context, android.R.layout.simple_dropdown_item_1line,
new ArrayList<Place>());
this.context = context;
geoDataClient = Places.getGeoDataClient(context, null);
}
@Override
public int getCount() {
return placesList.size();
}
@Override
public String getItem(int position) {
return placesList.get(position);
}
@Override
public Filter getFilter() {
return filter;
}
@Override
public View getView(int position, View view, @NonNull ViewGroup parent) {
if (view == null) {
view = LayoutInflater.from(parent.getContext())
.inflate(android.R.layout.simple_dropdown_item_1line,
parent, false);
}
TextView textOne = view.findViewById(android.R.id.text1);
textOne.setText(placesList.get(position));
return view;
}
class PlacesAutoCompleteFilter extends Filter {
private Object lock = new Object();
private Object lockTwo = new Object();
private boolean placeResults = false;
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
placeResults = false;
final List<String> predictedPlacesList = new ArrayList<>();
if (prefix == null || prefix.length() == 0) {
synchronized (lock) {
results.values = new ArrayList<Place>();
results.count = 0;
}
} else {
final String searchStrLowerCase = prefix.toString().toLowerCase();
Task<AutocompletePredictionBufferResponse> task
= getAutoCompletePlaces(searchStrLowerCase);
task.addOnCompleteListener(new OnCompleteListener<AutocompletePredictionBufferResponse>() {
@Override
public void onComplete(@NonNull Task<AutocompletePredictionBufferResponse> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Auto complete prediction successful");
AutocompletePredictionBufferResponse predictions = task.getResult();
for (AutocompletePrediction prediction : predictions) {
predictedPlacesList.add((prediction.getFullText(null)).toString());
}
predictions.release();
} else {
Log.d(TAG, "Auto complete prediction unsuccessful");
}
placeResults = true;
synchronized (lockTwo) {
lockTwo.notifyAll();
}
}
});
while (!placeResults) {
synchronized (lockTwo) {
try {
lockTwo.wait();
} catch (InterruptedException e) {
}
}
}
results.values = predictedPlacesList;
results.count = predictedPlacesList.size();
Log.d(TAG, "Autocomplete predictions size after wait" + results.count);
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.values != null) {
placesList = (ArrayList<String>) results.values;
} else {
placesList = null;
}
// customize your places here:
for (int i = 0; i < placesList.size(); i++) {
placesList.set(i, removeSuffix(placesList.get(i), "Kerala)); India");
}
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
private Task<AutocompletePredictionBufferResponse> getAutoCompletePlaces(String query) {
AutocompleteFilter.Builder filterBuilder = new AutocompleteFilter.Builder();
Task<AutocompletePredictionBufferResponse> results =
geoDataClient.getAutocompletePredictions(query, null,
filterBuilder.build());
return results;
}
}
}
public static String removeSuffix(final String s, final String suffix) {
if (s != null && s.endsWith(suffix)) {
return s.split(suffix)[0];
}
return s;
}
}
activity_main.xml
可能像:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="<YOUR_PACKAGE_NAME>.MainActivity">
<fragment class="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<AutoCompleteTextView android:id="@+id/place_autocomplete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/background_light"
android:layout_margin="16dp"
android:padding="8dp"
android:inputType="text"
android:imeOptions="actionNext"
android:textSize="16sp"
android:hint="Type place name here" />
</RelativeLayout>
NB!根据[使用限制](https://developers.google.com/places/android-sdk/autocomplete#usage_limits:
- 如果您的应用以编程方式使用自动完成服务,则您的用户界面
必须显示“由Google强力驱动”的出处,或者出现
在Google品牌的地图中。