从`AutoCompleteTextView`获取当前建议

7

如何获取AutoCompleteTextView中当前的顶部建议?我已经让它建议项目,并注册了文本更改侦听器。我还在同一屏幕上有一个列表。当他们输入时,我想将列表滚动到当前的“最佳”建议。但是我无法弄清楚如何访问当前的建议,或者至少是顶部建议。我猜我正在寻找类似于AutoCompleteTextView.getCurrentSuggestions()的东西:

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
        }
    });
2个回答

16

我已经用以下代码实现了你想要的功能:

@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将打印显示在第一个项上的文本。

请注意,即使您尚未显示弹出窗口(建议),这也会发生。此外,您应该检查是否有通过筛选条件(即用户的输入)的任何项。

解决第一个问题的方法:

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

要解决第二个问题,请使用 getCount > 0。


很棒的答案!比我下面的临时方案好多了。 - Peter Knego
非常感谢您。我尝试了几天如何根据筛选项目的数量动态更改下拉菜单的高度,但它似乎在afterTextChanged事件之后进行筛选。dataSetObserver正是我需要使其工作的侦听器。 - Mike

1

AutoCompleteTextView 不会滚动到最佳选择,但会随着您键入逐渐缩小选择范围。这是一个示例: http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

AutoCompleteTextView 中我看不出有获取当前建议列表的方法。

唯一的方法似乎是编写 ArrayAdapter 的自定义版本,并将其传递给 AutoCompleteTextView.setAdapter(..)。这是 ArrayAdapter 的源代码。您只需要更改内部类 ArrayFilter.performFiltering() 中的一个方法,以便它公开 FilterResults:

.. 向内部类 ArrayFilter 添加字段:

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

..在 performFiltering: 方法结束之前

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

使用方法如下(从链接中改编的示例):

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;

我测试了你的代码,但是在“lastResults = (ArrayList<T>) results”这一行中,我们无法将FilterResults类型转换为ArrayList<T>。 - pengwang
你能告诉我如何修改吗?SDK2.2。 - pengwang
2
请看上面的答案 - 它比我的更好;) - Peter Knego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接