用户从下拉列表中选择项目后禁用Android AutoCompleteTextView。

20
我正在使用Android的AutoCompleteTextViewCursorAdapter为一个应用添加自动完成功能。在视图的onItemClickListener()中(即当用户触摸其中一个自动完成下拉项时),我检索文本并将其放置在EditText中,以便用户在需要时可以修改它。
但是,当我在TextView上调用setText()时,自动完成行为会被触发,下拉菜单再次显示。我只想在用户使用键盘输入新文本时才显示下拉列表。有办法实现这一点吗?

我正在这里做类似的事情!!! https://dev59.com/Y-o6XIcBkEYKwwoYPR_f - Etienne Lawlor
5个回答

21
您可以使用AutoCompleteTextView对象的dismissDropDown()方法。请查看文档。具体操作请参考dismissDropDown()方法。同时,请注意保留文档中的HTML标签。

我想要在输入新的键之前防止下拉菜单的显示。如果我使用dismissDropDown(),下拉菜单将在被解除之前短暂地显示。 - magneticMonster
如果您将方法调用放在onItemClickListener()中,它应该会在单击一个项目时关闭列表。这不是您想要的吗? - Franziskus Karsunke
@Vucko,很可能有某个东西正在将焦点和光标放回到自动完成文本框中,导致列表重新出现。 - Smitty-Werben-Jager-Manjenson
我在此期间已经解决了它。不过现在不记得怎么做了 :D - Vucko

9
当我们点击AutoCompleteTextView中建议的项目时,会在执行onItemClick之前执行onTextChanged()。为了避免这种情况,请尝试以下代码...
autocompletetextview.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (autocompletetextview.isPerformingCompletion()) {
            // An item has been selected from the list. Ignore.
        } else {
            // Perform your task here... Like calling web service, Reading data from SQLite database, etc...
        }
    }

    @Override
    public void afterTextChanged(final Editable editable) {

    }
});

2
是的!这正是我所需要的。你说得对,我的应用程序在用户选择列表中的项目后进行了API调用,然后重新填充了列表并显示出来!现在已经修复了,谢谢! - Someone Somewhere
3
谢谢,autocompletetextview.isPerformingCompletion() 刚刚救了我一命。 - Cătălin Florescu
适用于我的最佳且最简单的解决方案。谢谢! - Rafay Ali

7

如果你想要关闭 AutoCompleteTextView 的下拉列表,你可以使用它的 post(Runnable r) 方法。这对我很有效 :)

这里是一个例子:

mAutoCompleteTextView.post(new Runnable() {
    public void run() {
        mAutoCompleteTextView.dismissDropDown();
    }
}

我也在我的活动中的onConfigurationChanged中添加了相同的代码片段。 - Svetoslav Marinov
这对我没用,下拉菜单又出现了。 - Vucko
@Vucko 请检查我的答案。这个技巧对我也不起作用。 - CopsOnRoad

4
在花费几个小时的时间后,我回答了自己的问题:实际上,你应该实现自己的OnItemClickListener,而不是依赖于现有的点击监听器来填充TextView。最初我实现了onItemClickListener,因为它使用Cursor.toString()的结果来填充文本视图。要更改输出字符串,你应该在CursorAdapter中实现convertToString(Cursor)。返回的CharSequence将被填充到文本视图中。
这样做也会防止下拉菜单再次出现(因为setText()触发完成行为,但默认的onItemClickListener没有这样做)。

如果我的适配器扩展了BaseAdapter而不是CursorAdapter怎么办?我没有这样的方法,但我有同样的问题(我重写了getFilter方法)。 - Vadim Kotov
啊,找到了:你需要重写 Filter.convertResultToString 方法来提供字符串表示。 - Vadim Kotov

1
不同的方法。我同意dismissDropDown()可以工作,但在我的情况下,它没有按预期工作。所以,我使用了:
autoCompleteTextView.setDropDownHeight(0);

如果您想再次显示下拉列表,可以使用
autoCompleteTextView.setDropDownHeight(intValue);

是的,我也尝试过这个,但我怎么知道 intValue 是多少呢?每次搜索都不一样啊,伙计 :) - Vucko
在我的情况下,我使用了一个硬编码值。这就像一个最大值,如果您有更少的项目选择,高度将减少以适应您的新选择。因此,使用硬编码值没有任何不利之处。 - CopsOnRoad
这在技术上是可行的,但你仍然会看到阴影。它非常丑陋。 - John Lord

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