【问题标题】:Autocomplete - only city自动完成 - 仅限城市
【发布时间】:2018-03-24 23:15:53
【问题描述】:

有人知道我如何过滤这个自动完成功能,那个用户只接收城市名称吗?只喜欢:伦敦,巴黎等,没有其他结果:“伦敦桥”,“伦敦眼”等 - 就像例子一样。 我在 Google Places API Autocomplete 中使用,

所以我使用这个代码过滤器:

public Filter getFilter() {
    Filter filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            synchronized (filterResults) {

                if (constraint != null) {
                    getAutocomplete(constraint);
                    result = mPlaceAPI.autocomplete(constraint.toString());

                    if (result != null) {
                        filterResults.values = result;
                        filterResults.count = result.size();
                    }
                }
                return filterResults;

并获得唯一的城市名称:

HttpURLConnection conn = null;
    StringBuilder jsonResults = new StringBuilder();

    try {
        StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
        sb.append("?key=" + API_KEY);
        sb.append("&types=(cities)");
        sb.append("&input=" + URLEncoder.encode(input, "utf8"));

enter image description here

非常感谢:)

【问题讨论】:

    标签: android autocomplete google-api


    【解决方案1】:

    我不知道您为什么要构建互联网请求,但如果没有必要,您可以使用 google Places API。 这是谷歌guide

    在您的应用中,您只需执行几个步骤:

    1)构建并连接google API客户端

    googleApiClient = new GoogleApiClient.Builder(Activity.this)
                .addApi(Places.GEO_DATA_API)
                .build();
        googleApiClient.connect();
    

    2)那么你有几种方法可以做:使用自动完成意图,PlaceAutocompleteFragment 或创建PendingResult<AutocompletePredictionBuffer>,从中获取结果并在你想要的地方使用它。我不得不使用最后一个,所以我创建了 AutocompleteFilter

    AutocompleteFilter.Builder builder = new AutocompleteFilter.Builder()
    .setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES);
    

    可以看到 AutocompleteFilter 常量here 然后我创建了 PendingResult

    PendingResult<AutocompletePredictionBuffer> result
                            = Places
                            .GeoDataApi
                            .getAutocompletePredictions(googleApiClient, charSequence.toString(), null, builder.build());
    

    并在回调中做了我需要的事情

    result.setResultCallback(new ResultCallback<AutocompletePredictionBuffer>{...});
    

    在回调中,您可以通过以下方式接收信息:

    Status status = autocompletePredictions.getStatus();
                        Handler handler = new Handler();
                        int size = autocompletePredictions.getCount();
                        if (status.isSuccess()){
                            for (int i = 0; i < size; i++){
                                //Do what you need
                            }
                        }
    

    也许这不是最好的方法,但它对我有用,它类似于构建请求,就像你所做的那样(在我看来)。无论如何,您可以在guide 中找到最适合您的方法。 希望对您有所帮助,如果浪费了您的时间,我们深表歉意。

    【讨论】:

    • @Bon 你这里有错误吗?如果不是,您可以在尝试从结果中获取数据的地方放置断点并观察这里的内容吗?并确保您以正确的方式连接 GoogleApiClient。
    • 我没有收到错误消息,我放了断点,他告诉我过滤器正在做什么..但我仍然没有得到过滤器唯一的城市..我不知道我想念什么以及我想念什么应该做..
    • @Bon 过滤器效果很好,我的意思是在回调中放置断点并观察你得到的结果
    • @Bon 我在回复中添加了一些代码 sn-p,希望对您有所帮助
    • 断点说“对象已被收集无法评估android.os.Bundle.toString()..
    【解决方案2】:

    这是我需要从结果 autocomlete API google places 中获取 onlt city 的代码: MainActivity:

     protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .addApi(Places.GEO_DATA_API)
                .build();
    
    }
    
    @Override
    public void onConnected(Bundle bundle) {
    }
    
    @Override
    public void onConnectionSuspended(int i) {
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    }
    
    public void searchPlace(final Editable editable) {
    
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!editable.toString().equals("") && mGoogleApiClient.isConnected()) {
                    try {
                        mAutoCompleteAdapter.getFilter().filter(editable.toString());
    
                    } catch (Exception e) {
                        Log.e(TAG, "Exception");
    

    另一个活动:PlaceAPI

     public ArrayList<String> autocomplete (String input) {
        ArrayList<String> resultList = null;
    
        HttpURLConnection conn = null;
        StringBuilder jsonResults = new StringBuilder();
    
        try {
            StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
            sb.append("?key=" + API_KEY);
            sb.append("&types=(cities)");
            sb.append("&input=" + URLEncoder.encode(input, "utf8"));
    
            URL url = new URL(sb.toString());
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
    

    适配器:

    private ArrayList<String> result;
    
    
    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                synchronized (filterResults) {
    
                    if (constraint != null) {
                        getAutocomplete(constraint);
                        result = mPlaceAPI.autocomplete(constraint.toString());
    
                        if (result != null) {
                            filterResults.values = result;
                            filterResults.count = result.size();
                        }
                    }
                    return filterResults;
                }
            }
    
    
            @Override
            protected void publishResults(CharSequence constraint, final FilterResults filterResults) {
                synchronized (filterResults) {
    
                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (filterResults != null && filterResults.count >= 0) {
                                mResultList = resultList;
                                notifyDataSetChanged();
                            } else {
                                notifyDataSetInvalidated();
                            }
                        }
                    });
    
                }
    
            }
        };
    
        return filter;
    }
    

    这是我添加到 AutocompletePredictionBuffer 的内容:

     private ArrayList<PlaceAutocomplete> getAutocomplete(CharSequence constraint) {
    
        if (mGoogleApiClient.isConnected()) {
    
            PendingResult<AutocompletePredictionBuffer> results =
                   Places.GeoDataApi.getAutocompletePredictions(mGoogleApiClient, constraint.toString(),
                            mBounds, mPlaceFilter);
    
    
            AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);
            final Status status = autocompletePredictions.getStatus();
    
            if (!status.isSuccess()) {
                if (!mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.connect();
                }
                autocompletePredictions.release();
    
                return new ArrayList<>();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 2012-12-28
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多