2010-10-17 43 views
7

Làm cách nào để nhận đề xuất hàng đầu hiện tại trong một số AutoCompleteTextView? Tôi có nó đề xuất các mục, và tôi có một người nghe thay đổi văn bản đã đăng ký. Tôi cũng có một danh sách trên cùng một màn hình. Khi họ nhập, tôi muốn cuộn danh sách sang đề xuất "tốt nhất" hiện tại. Nhưng tôi không thể tìm ra cách truy cập các đề xuất hiện tại hoặc ít nhất đề xuất hàng đầu. Tôi đoán tôi đang tìm kiếm một cái gì đó giống như AutoCompleteTextView.getCurrentSuggestions():Nhận đề xuất hiện tại từ `AutoCompleteTextView`

autoCompleteTextView.addTextChangedListener(new TextWatcher() { 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
      String currentText = autoCompleteTextView.getText(); 
      String bestGuess = autoCompleteTextView.getCurrentSuggestions()[0]; 
      //          ^^^ mewthod doesn't exist 
      doSomethingWithGuess(bestGuess); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // do nothing 
     } 
     public void afterTextChanged(Editable s) { 
      // do nothing 
     } 
    }); 

Trả lời

15

Tôi đã thực hiện những gì bạn muốn thực hiện với mã sau:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.autocomplete_1); 

    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
    AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit); 
    textView.setAdapter(adapter); 

    adapter.registerDataSetObserver(new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      Log.d(TAG, "dataset changed"); 
      Object item = adapter.getItem(0); 

      Log.d(TAG, "item.toString "+ item.toString()); 
     } 
    }); 
} 

item.toString sẽ in văn bản được hiển thị trên mục đầu tiên.

Lưu ý rằng điều này sẽ xảy ra ngay cả khi bạn hiện không hiển thị cửa sổ bật lên (đề xuất). Ngoài ra, bạn nên kiểm tra xem có bất kỳ mục nào vượt qua tiêu chí lọc (hay còn gọi là đầu vào của người dùng).

Để giải quyết vấn đề đầu tiên:

int dropDownAnchor = textView.getDropDownAnchor(); 
    if(dropDownAnchor==0) { 
     Log.d(TAG, "drop down id = 0"); // popup is not displayed 
     return; 
    } 
    //do stuff 

Để giải quyết vấn đề thứ hai, sử dụng getCount> 0

+0

Câu trả lời hay! Tốt hơn nhiều so với hack của tôi dưới đây. –

+0

Cảm ơn bạn rất nhiều vì điều này. Tôi đã cố gắng một vài ngày để tìm ra cách tự động thay đổi chiều cao của trình đơn thả xuống của tôi dựa trên số lượng các mục được lọc và nó dường như lọc sau sự kiện 'afterTextChanged'. DataSetObserver chính xác là người nghe mà tôi cần để làm cho nó hoạt động – Mike

+0

Đây là một điểm trên! –

1

AutoCompleteTextView không di chuyển xuống để lựa chọn tốt nhất, nhưng thu hẹp sự lựa chọn khi bạn gõ. Dưới đây là ví dụ về nó: http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

Như tôi thấy từ AutoCompleteTextView không có cách nào để nhận danh sách đề xuất hiện tại.

Cách duy nhất dường như là viết phiên bản tùy chỉnh của ArrayAdapter và chuyển nó vào AutoCompleteTextView.setAdapter (..). Đây là số source to ArrayAdapter. Bạn chỉ phải thay đổi một phương pháp trong ArrayFilter.performFiltering lớp bên trong() để nó lộ ra FilterResults:

.. thêm lĩnh vực để bên trong lớp ArrayFilter:

public ArrayList<T> lastResults; //add this line 

.. trước khi kết thúc của phương pháp performFiltering:

lastResults = (ArrayList<T>) results; // add this line 
    return results; 
} 

Sử dụng nó như thế này (ví dụ chuyển thể từ link):

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 
CustomArrayAdapter<String> adapter = new CustomArrayAdapter<String>(this, R.layout.list_item, COUNTRIES); 
textView.setAdapter(adapter); 

// read suggestions 
ArrayList<String> suggestions = adapter.getFilter().lastResult; 
+0

i kiểm tra mã của bạn, nhưng trong "lastResults = (ArrayList ) kết quả", nhưng chúng ta có thể không chuyển đổi một loại FilterResults để ArrayList . – pengwang

+0

bạn có thể cho tôi biết cách sửa đổi không? sdk2.2 – pengwang

+2

Hãy nhìn vào câu trả lời ở trên - đó là giải pháp tốt hơn so với tôi;) –

Các vấn đề liên quan