【问题标题】:Autocomplete textview not showing results under certain situations in android自动完成文本视图在android中的某些情况下不显示结果
【发布时间】:2014-08-23 11:07:00
【问题描述】:

我的 android 活动中有一个自动完成文本视图,其中的结果是通过在 arrayadapter 中传递一个字符串 arraylist 来获得的。字符串 arraylist 包含以下格式的元素:

city-name-country(code)

例如字符串arraylist中的一个条目是这样的:

Cochin-Kochi International Airport-India(COK)

当我开始输入字符时,它开始显示基于city 的字符串数组列表的结果,但是如果我需要根据codecok 获得结果,我应该在代码中进行哪些更改?我的意思是,即使输入城市或代码,用户也应该得到结果。在我的情况下,当我输入 cok 在我的情况下,自动完成文本视图中没有显示结果。但实际上有一个条目对应于字符 cok 即高知国际机场。但我无法得到这个结果。有人可以帮助我...这是我的自动完成文本视图的代码:

actv1=(AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView1);
loc=SplashScreen.loc;//obtained from a static arraylist in another activity.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,loc);
actv1.setAdapter(adapter);

编辑:

我已将以下代码添加到我的程序中,问题是当我键入 COK 时,结果 Cochin-Kochi International Airport-India(COK) 在自动完成文本视图中仅闪烁不到 1 秒,然后它就消失了。该建议仅显示不到 1 秒,并且在自动完成文本视图中不显示任何内容。我实现的代码中可能出现的错误是什么?

actv1.addTextChangedListener(new TextWatcher() {

             @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

                 String filter = s.toString().toLowerCase();
                listItems = new ArrayList<String>();
                for (String listItem : loc) {
                    if (listItem.toLowerCase().contains(filter))
                    {
                        listItems.add(listItem);

                    }

                }
                if (listItems.size() < 1){

                Toast toast = Toast.makeText(getActivity().getApplicationContext(),
                        "No entries contain your search parameters",
                        Toast.LENGTH_SHORT);

                toast.show();

                }
                ArrayAdapter<String> adapt=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,listItems);
                actv1.setAdapter(adapt);

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

【问题讨论】:

  • 您必须创建一个自定义 ArrayAdapter,并覆盖 getFilter() performFiltering() 方法。这是一个例子:gist.github.com/tobiasschuerg/3554252
  • 你能帮我提供代码吗,因为我是新手...
  • 查看我的编辑@SimonMarquis。
  • 你不必使用addTextChangedListener,使用它前面解释的过滤方法

标签: android arraylist android-arrayadapter autocompletetextview


【解决方案1】:

正如 simon 所说,您需要为 ArrayAdapter 自定义过滤器,以更改过滤逻辑的工作方式。不幸的是,对于刚接触适配器的人来说,这不是一件容易的事。此外,即使您可以覆盖过滤器并更新逻辑,您也不应该这样做。它可能导致许多其他问题。我建议使用opensource repo 中的ArrayBaseAdapter。它就像使用 ArrayAdapter 一样,但提供了一个简单的实现方法,允许您指定过滤逻辑的行为方式。

【讨论】:

  • 你能帮我实现带有过滤的自定义数组适配器吗,因为我是这个领域的新手..
  • 您不会为每次文本更改都创建一个这样的新适配器。保持列表和适配器不变,并致电adapter#getFilter().filter(constraint)。如果您想自定义搜索逻辑,请查看我在答案中提供的链接
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多