AutoCompleteTextView在我输入完整单词后按空格键时没有下拉菜单显示。

14

我的主活动代码:

// here you put all your data.
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner",
        "Vineet John Chaturvedi", "Lucky Kumar Verma" };

ArrayList<String> alAutoCompleteList;
AutoCompleteTextView acTV;
ArrayAdapter<String> adapter1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // etAuto = (EditText) findViewById(R.id.etAuto);
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV);
    // Arraylist
    alAutoCompleteList = new ArrayList<String>();
    adapter1 = new ArrayAdapter<String>(MainActivity.this,
            android.R.layout.simple_dropdown_item_1line,     alAutoCompleteList);


    acTV.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            if (acTV.enoughToFilter()) {
                acTV.showDropDown();
                acTV.bringToFront();
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            alAutoCompleteList.clear();
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            String acText = acTV.getText().toString().trim();

            for (String item : dataArray) {

                if     (item.toLowerCase().contains(acText.toLowerCase())) {
                    alAutoCompleteList.add(item);
                }
            }


            acTV.setThreshold(4);
            acTV.setAdapter(adapter1);
            acTV.showDropDown();

        }
    });
当我搜索“sharma”并在后面按空格时,建议就会消失。 我希望这些建议能够保持在那里。 我已经尝试了各种方法,但没有成功。 有人可以帮忙吗?
编辑: 请问有人可以在它们的模拟器上尝试此代码吗?只需在xml中添加一个AutoCompleteTextView,然后运行即可。
4个回答

15

首先,您设置AutoCompleteTextView上的TextWatcher监听器是否有任何原因?如果您这样做是为了自己过滤数据,则不应该这样做(因为小部件默认情况下会执行此操作,因此您的代码是不正确的)。

当我搜索"sharma"并在之后加上一个空格时,建议会消失。我希望这些建议依然存在。

这是由于适配器和其中使用的默认Filter实现引起的,AutoCompleteTextView在幕后使用它们来提供您在下拉列表中看到的值。对于ArrayAdapter而言,其默认行为就是您所见到的,您可以在这个答案中找到解释。解决方案是实现自己的适配器,并使用一个可以搜索整个适配器行数据的过滤器来进行过滤。 我已经取了SDK中ArrayAdapter类的代码,并进行了微小的调整,以便在单词后插入空格时过滤不会中断。 您可以在这里找到该类,因为代码太大无法发布。只需将该类复制到您的项目中,并像正常的ArrayAdapter一样使用它:

FilterWithSpaceAdapter<String> adapter1;
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this,
            android.R.layout.simple_dropdown_item_1line, dataArray);

1
这个解决方案不起作用。如果你输入空格,忽略下拉建议。 - cnbandicoot
@cnbandicoot,请提供更多关于你正在做的事情的细节,以便我们能够帮助你。 - user
1
我遇到了相同的问题和一些复杂情况。问题是下拉列表没有显示,而当字符串数组包含带点、加号和其他特殊字符的字符串时,我什么也没看到。我使用了FilterWithSpaceAdapter.java并应用了您的解决方案,为我的autocompletetextview实现了必要的行为。非常感谢!我一箭双雕 :)。 - Orlov Const

2

首先,你不需要使用TextWatcher来配合AutoCompleteTextView,因为AutoCompleteTextView有自己的文本监视器,即MyWatcher方法。你需要使用:

setThreshold(3);
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays);
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_dropdown_item_1line,AndroidDesk);      
   cloths.setThreshold(1);
   cloths.setAdapter(My_arr_adapter);
   cloths.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {                               
   }
   });

2

你不需要 Textwatcher,AutoCompleteTextView 使用你设置的 Adapter 的 Filter。默认的 Adapter 通过调用 toString() 方法来过滤条目。自然地,如果用户输入了一个空格,值将不再匹配。要实现这种自定义行为,你不应该添加 textwatcher,而是构建一个自定义适配器。你仍然可以扩展 ArrayAdapter 或 SimpleAdapter。你可以通过覆盖 getFilter() 和 publishResults() 方法来实现你的自定义过滤行为(在你的情况下,是一次 trim() 调用)。你可以在这里找到如何做的示例:此处这里


简直不敢相信我花了这么多时间在墙上撞头,却从未意识到我的适配器必须使用toString来确定如何过滤元素,仅仅因为这个问题就导致什么都无法正常工作,哈哈。谢谢。 - Guilherme Santos

0

我认为文本监视器存在问题,因为自动完成文本视图不需要文本监视器,因为它有自动监听事件。你只需将数组简单地传递到适配器中,而不是列表中。在alAutoCompleteList中没有任何值。你从未向列表中添加过值。

  • 你可以这样做: alAutoCompleteList.add("数据一"); alAutoCompleteList.add("数据二");

  • 或者将dataArray传递给适配器。 adapter1 = new ArrayAdapter(MainActivity.this, android.R.layout.simple_dropdown_item_1line,dataArray );

  • 不需要使用文本监视器。


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