Автозаполнение текста не показывает результаты в определенных ситуациях в Android

У меня есть текстовое представление автозаполнения в моей активности Android, в котором результаты получаются путем передачи строкового массива в адаптере массива. Строковый массив arraylist содержит элементы в следующем формате:

city-name-country(code)

например, одна запись в массиве строк выглядит так:

Cochin-Kochi International Airport-India(COK)

Когда я начинаю вводить символы, он начинает показывать мне результаты из массива строк на основе city, но если мне нужно получить результаты на основе code, т.е. cok, какие изменения я должен внести в код? Я имею в виду, что пользователь должен получать результаты, даже когда он набирает город или код. В моем случае, когда я набираю 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) {

            }
        });

person njnjnj    schedule 23.08.2014    source источник
comment
Вам нужно будет создать собственный ArrayAdapter и переопределить методы getFilter() performFiltering(). Вот пример: gist.github.com/tobiasschuerg/3554252   -  person Simon Marquis    schedule 23.08.2014
comment
Не могли бы вы помочь мне, дав код, потому что я новичок в этом...   -  person njnjnj    schedule 23.08.2014
comment
Смотрите мое редактирование @SimonMarquis.   -  person njnjnj    schedule 25.08.2014
comment
Вам не обязательно использовать addTextChangedListener, используйте метод фильтрации, описанный ранее.   -  person Simon Marquis    schedule 25.08.2014


Ответы (1)


Как упомянул Саймон, вам нужно настроить фильтр для ArrayAdapter, чтобы изменить принцип работы логики фильтрации. К сожалению, это непростая задача для тех, кто плохо знаком с адаптерами. Кроме того, хотя вы можете переопределить фильтр и обновить логику, этого делать не следует. Это может привести ко многим другим проблемам. Я предлагаю использовать ArrayBaseAdapter из этого репозитория с открытым исходным кодом. Это похоже на использование ArrayAdapter, но предоставляет простой метод для реализации, который позволяет вам указать, как ведет себя логика фильтрации.

person Jay Soyer    schedule 24.08.2014
comment
Не могли бы вы помочь мне в реализации пользовательского адаптера массива с фильтрацией, потому что я новичок в этой области. - person njnjnj; 25.08.2014
comment
Вы не создаете такой новый адаптер для каждого изменения текста. Оставьте список и адаптер как есть и вызовите adapter#getFilter().filter(constraint). Если вы хотите настроить логику поиска, перейдите по ссылке, которую я предоставил в своем ответе. - person Jay Soyer; 25.08.2014