我的应用程序中有一个自动完成的文本视图,允许用户输入地址,文本视图使用地点 API 向他们显示以用户正在使用的字母开头的不同位置。我实现了 Places API,用户能够看到地点,但是当他们选择一个地方时,我想检索该地点并根据我的需要使用它(例如检索 LatLng 和类似的东西),但地点对象是字符串对象,我不知道如何将其检索为 Place 或将字符串对象转换为 Place 对象。到目前为止,我尝试了以下内容,但无济于事。这是我的适配器类。
class GooglePlacesAutocompleteAdapter extends ArrayAdapter implements Filterable {
private ArrayList resultList;
public GooglePlacesAutocompleteAdapter(Context context, int list, int textViewResourceId) {
super(context, list, textViewResourceId);
}
@Override
public int getCount() {
return resultList.size();
}
@Override
public String getItem(int index) {
return resultList.get(index).toString();
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
// Retrieve the autocomplete results.
resultList = autocomplete(constraint.toString());
// Assign the data to the FilterResults
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return filter;
}
}
msg.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem));
msg.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final String selectedPlace = (String) parent.getItemAtPosition(position);
Place pl = new Place() {
@Override
public String getId() {
return null;
}
@Override
public List<Integer> getPlaceTypes() {
return null;
}
@Override
public CharSequence getAddress() {
return null;
}
@Override
public Locale getLocale() {
return null;
}
@Override
public CharSequence getName() {
return selectedPlace;
}
@Override
public LatLng getLatLng() {
return null;
}
@Override
public LatLngBounds getViewport() {
return null;
}
@Override
public Uri getWebsiteUri() {
return null;
}
@Override
public CharSequence getPhoneNumber() {
return null;
}
@Override
public float getRating() {
return 0;
}
@Override
public int getPriceLevel() {
return 0;
}
@Override
public Place freeze() {
return null;
}
@Override
public boolean isDataValid() {
return true;
}
};
LatLng selectedltlng = getSelectedLatLng(pl);
Log.e("selected", selectedltlng.toString());
//Place selectedPlace = Places.GeoDataApi.getPlaceById(mGoogleApiClient, );
//Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
private LatLng getSelectedLatLng(Place placeStringe) {
LatLng placeltlg = placeStringe.getLatLng();
Log.e("selcete", placeltlg.toString());
return placeltlg;
}
});
但这会引发空指针异常。我还尝试将字符串对象转换为 Object 像这样
Object selectedPlace = (Object) parent.getItemAtPosition(position);
Place plac = (Place)selectedPlace;
但这抛出了投射异常。我怎样才能以有效的方式做到这一点?
一周前我做了一个城市选择器。它使用自定义扩展的自动完成文本视图小部件。也许这对你有帮助。此小部件允许用户输入字符(灰色),然后显示匹配城市的列表。用户从列表中选择一个城市(它变成黑色),然后选择保存在cityData对象中的城市,可以通过.getCity()调用进行检索。
这是代码:
public class CityAutoCompleteEditText extends AutoCompleteTextView implements View.OnFocusChangeListener, TextWatcherAdapter.TextWatcherListener {
// City object (code, name, type, level and so on)
private OKTMOUnit cityData;
// One of the constructors. You need to implement all with init() inside
public CityAutoCompleteEditText(Context context) {
super(context);
init(context, null);
}
// Initial data setter
public void setCity(OKTMOUnit city) {
setText(city.toString());
setTextColor(resource_black);
cityData = city;
}
// Data getter
public OKTMOUnit getCity() {
return cityData;
}
private void init(Context context, AttributeSet attrs) {
......
super.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// On click - set color black and init cityData
cityData = (OKTMOUnit) getAdapter().getItem(position);
setTextColor(resource_black);
}
});
.....
}
@Override
public void onTextChanged(EditText view, String text) {
// Text changed by hand - grey it and clear cityData
cityData = null;
setTextColor(resource_grey);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (cityData == null) {
setText("");
}
}
}
和适配器:
public class CityAutoCompleteAdapter extends BaseAdapter implements Filterable {
private static final int MAX_RESULTS = 20;
private Context mContext;
private ArrayList<OKTMOUnit> mData;
public CityAutoCompleteAdapter(Context context) {
mData = new ArrayList<>();
mContext = context;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public OKTMOUnit getItem(int index) {
return mData.get(index);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.autocomplete_dropdown_item, parent, false);
}
if (convertView != null) {
((TextView) convertView.findViewById(R.id.autoCompleteCity)).setText(getItem(position).getFullCity());
((TextView) convertView.findViewById(R.id.autoCompleteRegion)).setText(getItem(position).getFullRegion());
}
return convertView;
}
}
补充:我从适配器中删除了public Filter getFilter() {}
代码以简化它。
试试这个 它是用模型类完成的,你可以得到地名,地址,纬度,长 我发现非常有用 http://coderzpassion.com/android-working-google-places-api/