3

我有一个 AutoCompleteTextView,我想在其中搜索位置,例如:您键入“vig”,AutoCompleteTextView 列表显示了 5 个最佳结果:“4560 Vig”、“Juan Pablo Perez..”、“The Vig 4041.. .", "Vig" 另一个例子,你输入“vigo”:它说正确的地方:“Vigo, Pontevedra”,你可以选择它并把它放在 AutoCompleteTextView 上。

现在,我所拥有的工作几乎很好,但我有一个错误:

  1. 显示列表仅在您删除字符时显示,如果没有则不显示,它显示的是最后一个字符串结果,例如:您输入了“vigo”,没有出现任何内容,您删除了“o”和显示列表显示“vigo”而不是“vig”的结果,这是目前在 AutoCompleteTextView 中键入的内容。

我在 AsyncTask 中执行位置搜索:

private class SearchAddress extends AsyncTask<String, Void, String[]> {

     @Override
     protected String[] doInBackground(String... params) {
         //adapter.clear();
         String[] addressArray = getStreetList(query);
             return addressArray;
     }    
     @Override
     protected void onPostExecute(String[] addressArray) {
         if(addressArray == null)
             Toast.makeText(NewRouteActivity.this, "No address obtained from server", Toast.LENGTH_SHORT).show();
         else{
            adapter.clear();
            for(String address: addressArray){
                adapter.add(address); <------HERE IS THE 2ND ERROR
                Log.d("ASYNC", address);
             }
         }
     }

     @Override
     protected void onPreExecute() {}
     @Override
     protected void onProgressUpdate(Void... values) {}
}

这是我的 AutoCompleteTextView 代码:

String[] array = {};    
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, array);//simple_dropdown_item_1line
autoFrom.setAdapter(adapter);
autoTo.setAdapter(adapter);
asyncSearch = new SearchAddress();
autoFrom.addTextChangedListener(new TextWatcher() {
    @Override
    public void afterTextChanged(Editable s) {}
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (((AutoCompleteTextView) autoFrom).isPerformingCompletion()) {return;}
        if (s.length() < 2) {
            return;
        }else{
            query = s.toString();
            if (asyncSearch.getStatus().equals(AsyncTask.Status.FINISHED)){
                asyncSearch = new SearchAddress();
                asyncSearch.execute(query);
                Log.d("ASYNC", "FINISH GOOD");
                Log.d("ASYNC", query);
            }else{
                Log.d("ASYNC", "CANCEL");
                asyncSearch.cancel(false);
                asyncSearch = new SearchAddress();
                asyncSearch.execute(query);
            }
            return;
        }
    }
});

我希望这已经足够了,getStreetList() 运行良好,取得了良好的效果。如果您需要其他东西,请询问。

提前致谢!!!

4

1 回答 1

1

我不知道这是否会对您有所帮助,但我遇到了 TextWatcher 和 AutoCompleteTextView 的问题。您应该在适配器上使用过滤器,而不是 TextWatcher。

google Places + AutoCompleteTextView 的一个很好的实现:

https://developers.google.com/places/training/autocomplete-android

于 2013-08-23T13:16:13.407 回答