在项目点击时不要将文本值设置为AutoCompleteTextView。

6

我在屏幕上有一个AutocompleteTextView。默认情况下,当用户单击autocompletetextviews下拉列表中的项目时,它会将此autocompletetextview的文本设置为所选项目的值。

有没有办法禁用此功能?因此,当用户单击下拉项时,只触发onItemClickListener?

在onItemClickListener中将值设置为“”不是选项。

autoCompleteTextView.setOnItemClickListener { adapterView, view, i, l -> 
    autoCompleteTextView.setText("")
}

我需要我的 TextWatcher 不被触发


为什么?AutoCompleteTextView 的整个目的就是自动完成用户选择的内容。无论如何,只需取消 TextWatcher,设置文本,然后重新设置 TextWatcher 即可。 - TheWanderer
@TheWanderer,我如何知道何时取消文本监视器?我仍然需要监视用户输入。 - Dannie
当您的项单击侦听器被触发时,请取消设置它,然后在该侦听器内将文本重置为空后重新设置它。 - TheWanderer
@TheWanderer 这不是它的工作方式
  1. 用户点击项目
  2. 自动完成设置其值为所选项目
  3. 触发文本监视器
  4. 触发onItemClickListener
  5. ...
- Dannie
你不需要任何 TextWatcher - 你所要做的就是在你传递给 AutoCompleteTextViewFilterable 适配器中实现一个 Filter - 可以参考这里了解如何间接地实现它(而不是从头开始实现 Filter)。 - pskink
1个回答

9

AutoCompleteTextView 使用此类来检测其下拉菜单上的单击事件:

private class DropDownItemClickListener implements AdapterView.OnItemClickListener {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        performCompletion(v, position, id);
    }
}

在那个performCompletion()方法里,实际上有一个调用来改变TextView的内容:

replaceText(convertSelectionToString(selectedItem));

replaceText() 方法是 protected 的,这意味着您可以创建 AutoCompleteTextView 的子类并覆盖它以不执行任何操作:

public class MyAutoCompleteTextView extends AppCompatAutoCompleteTextView {

    public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void replaceText(CharSequence text) {
        // do nothing
    }
}

现在,只需将您的<AutoCompleteTextView>标签替换为<com.example.yourprojecthere.MyAutoCompleteTextView>标签,就可以完成设置了。

1
哇!谢谢。运行得很好。有时候我想知道有些人是怎么知道这些细节的 =)?你曾经遇到过同样的问题吗? - Dannie
1
在这种情况下,在阅读您的问题之前,我没有头绪。我查看了“AutoCompleteTextView”的源代码,并在几分钟内找到了相关的代码。有些东西很明显,比如构造函数中的这行代码:mPopup.setOnItemClickListener(new DropDownItemClickListener()); - Ben P.
@Dannie,你需要TextWatcher做什么?为什么要“监视”输入的文本?是为了过滤建议吗?如果是这样,请在您的Filterable适配器中使用Filter,不要使用那些来自使用TextWatcher的变通方法。 - pskink
@pskink 我需要获取输入的文本以查询服务器,而自动完成只是过滤我现有的内容。因此,当用户输入数据时(当然要使用去抖动器),我会向服务器发出新的调用。但是,当用户从下拉列表中选择一个项目时,由于触发了文本监视器,我不想再进行最后一次不必要的调用。 我仍然喜欢这种方式。TextWatcher处理新输入,AutoComplete处理我拥有的数据的过滤。 - Dannie

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