2016-03-11 36 views
0

這聽起來很簡單,但對我來說很難。我有一個顯示用戶位置地址的自動完成textview。如果用戶輸入除位置以外的其他位置,我還實現了一個地址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完成所有你需要的是提供過濾數據到適配器 – pskink

+0

@pskink我正在實現AutocompleteTextView類的TextWatcher和OnItemClickListener接口。我不明白你的意思。 –

+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。如果我註釋掉隱藏部分,我在輸入文本後不會得到結果。 –

相關問題