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”并按下空格后,建议就会消失。我希望这些建议留在那里。我什么都试过了,但没有成功。有人可以帮忙吗?

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

4

4 回答 4

15

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

当我搜索“sharma”并在此之后按一个空格。建议消失。我希望这些建议留在那里。

发生这种情况是因为适配器和Filter它附带的默认实现,这些元素AutoCompleteTextView在后台使用以提供您在下拉列表中看到的值。an 的默认行为ArrayAdapter是您看到的行为,您可以在此答案中找到解释。解决方案是使用过滤器实现您自己的适配器,该过滤器将在整个适配器的行数据中搜索过滤器字符串。我ArrayAdapter从 SDK 中获取了该类的代码并进行了轻微调整,以便在单词后插入空格时过滤不会中断。您可以在此处找到该课程,因为代码太大而无法发布。只需复制项目中的类并将其用作普通类ArrayAdapter

FilterWithSpaceAdapter<String> adapter1;
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this,
            android.R.layout.simple_dropdown_item_1line, dataArray);
于 2012-10-25T10:12:51.370 回答
2

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

于 2012-10-29T19:28:58.053 回答
2

首先,你不需要TextWatcherwith ,AutoCompleteTextView因为AutoCompleteTextView它有自己的观看文本的方法 ie 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) {                               
   }
   });
于 2013-04-22T13:00:56.777 回答
0

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

  • 要么你必须这样做: alAutoCompleteList.add("data one"); alAutoCompleteList.add("数据二");

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

  • 无需使用 text watcher 。

于 2012-10-25T10:27:03.453 回答