在键入完整单词后按空格键时,AutoCompleteTextView不显示下拉列表

时间:2012-10-16 09:50:48

标签: android autocompletetextview

我的主要活动代码:

// 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();

        }
    });

当我搜索“夏尔马”并按下空格后,建议就会消失。我希望这些建议留在那里。我试图做一切但没有取得任何成功。有人可以帮忙吗?

编辑: 有人可以在他们的模拟器上试用这段代码吗?只需在xml中添加AutoCompleteTextView并运行它即可。

4 个答案:

答案 0 :(得分:15)

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

  

当我搜索“夏尔马”并在那之后按空格。建议去   关闭。我希望这些建议留在那里。

这是因为适配器和它附带的默认Filter实现,AutoCompleteTextView在引擎盖下使用的元素提供了您在下拉列表中看到的值。 ArrayAdapter的默认行为是您看到的行为,您可以在this answer中找到解释。解决方案是使用过滤器实现您自己的适配器,该过滤器将搜索整个适配器的行数据以查找过滤器字符串。我从SDK中获取了ArrayAdapter类的代码并稍作调整,因此在单词后插入空格时过滤不会中断。您可以找到类here,因为代码要发布大。只需复制项目中的类,并将其用作普通ArrayAdapter

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

答案 1 :(得分:2)

您不需要Textwatcher,AutoCompleteTextView使用您设置的适配器的过滤器。默认适配器通过调用它们上的toString()来过滤条目。当然,如果用户输入空格,则值不再匹配。要实现此自定义行为,您不应添加textwatcher,而是构建自定义适配器。您仍然可以扩展ArrayAdapter或SimpleAdapter。您可以通过覆盖getFilter()和publishResults()来实现自定义过滤行为(在您的情况下为trim()调用)。 Herehere您可以找到有关如何执行此操作的示例。

答案 2 :(得分: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) { } }); 。你需要使用:

{{1}}

答案 3 :(得分:0)

我认为文本观察器存在问题,因为自动完整文本视图不需要文本观察器,因为该自动侦听器事件。你必须简单地将数组传递给适配器而不是列表。 alAutoCompleteList ther在列表中没有任何值。你从来没有在列表中增加价值。

  • 要么你必须这样做:  alAutoCompleteList.add(“data one”);  alAutoCompleteList.add(“data two”);

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

  • 无需使用文本观察器。