2016-03-11 4 views
0

Это звучит просто, но мне было тяжело. У меня есть текст автозаполнения, который показывает адрес местоположения пользователя. Я также реализовал места api для получения адресов, если пользователь входит в другое место, отличное от своего местоположения. Все работает так, как предполагается, но результат в местах все еще показывается, даже когда уже есть адрес. Чтобы снизить затраты, я хотел бы получить результаты адреса только тогда, когда пользователь вводит адрес. Я сделал глобальное логическое значение и установить его верно, когда текст изменяется следующим образом:Как получить результаты автозаполнения, только когда пользователь вводит текст

autocomplete.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       isTextEntered = true; //to get autocomplete get results only after user enters text 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

Затем я проверяю, если логическое значение истинно, когда я установил свой адаптер, как например:

if (isTextEntered) { 
      autocomplete.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem)); 
      autocomplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        final String selectedPlace = (String) parent.getItemAtPosition(position); 
        autocomplete.setText(selectedPlace); 
       } 
      }); 
     } 

Но делать это в методе oncreate моей активности просто блокирует автозаполнение, показывая какие-либо результаты подсказок. Как я могу выполнить свою цель здесь? Как всегда, любая помощь очень ценится.

Это мой пользовательский класс адаптера:

class GooglePlacesAutocompleteAdapter extends ArrayAdapter implements Filterable { 

     private ArrayList resultList; 
     //private ArrayList<HashMap<String, Place>> results = new ArrayList<>(); 

     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 HashMap<String, Place> getItem(int index) {return results.get(index);} 

     @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; 
     } 
    } 
+0

Нет необходимости в 'TextWatcher' и' OnItemClickListener', это делается 'AutoCo mpleteTextView', все, что вам нужно, это предоставить отфильтрованные данные в адаптер. – pskink

+0

@pskink Я реализую интерфейсы TextWatcher и OnItemClickListener класса AutocompleteTextView. Я не понимаю, что вы имеете в виду. –

+0

см. Мой ответ [здесь] (http://stackoverflow.com/a/19860624/2252830) – pskink

ответ

1

Вот моя идея для достижения этой цели.

complete.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
        // 1. init autocomplete 
        // 2. show autocomplete 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       // 1. get enter text 
       // 2. update the datasource of autocomplete adapter 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // hide the autocomplete 
      } 
     }); 

Надеется, что это поможет

+0

Я использую и пользовательский класс адаптера. Вы имеете в виду рефакторинг этого класса. Теперь я отправлю этот код, чтобы вы поняли, как я это делаю. –

0

Что я предлагаю вам просто реорганизовать его как метод, как здесь

public void setSelectedPlace() { 
      autocomplete.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem)); 
      autocomplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        final String selectedPlace = (String) parent.getItemAtPosition(position); 
        autocomplete.setText(selectedPlace); 
       } 
      }); 
    } 

И называют это внутри afterTextChanged метода, как здесь, и скрыть автозаполнения после что

@Override 
public void afterTextChanged(Editable s) { 
    setSelectedPlace(); 
    // hide the autocomplete 
} 
+0

Это полностью скрывает текст acotocomple textview. Если я прокомментирую скрытую часть, я не получаю результаты после ввода текста. –

Смежные вопросы