Android ListView: как изменить содержимое списка?

#android #android-listview

#Android #android-listview

Вопрос:

У меня есть ListView, и идея заключается в том, что при вводе пользователем, чем только строки, представленные пользователю, будут начинаться с того, что написал пользователь.

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

       ListView lv = getListView();
      lv.setTextFilterEnabled(true);
  

но, как вы, наверное, знаете, некоторые устройства, такие как Samsung galaxi S, не имеют физической клавиатуры.

Что я сделал, так это создал простой файл макета, содержащий только EditText, и я использовал метод addHeaderView, поэтому теперь у меня есть EditText (пользователь может ввести его) над списком. Я хочу использовать addTextChangedListener, чтобы я мог реагировать на то, что вводит пользователь.

Вопрос в том, как изменить отображение, чтобы оно отображало только нужные мне строки (у меня нет проблем с поиском этих строк, проблема в том, как обновить текущий dispay) Или, если есть другое решение для преодоления того факта, что на некоторых устройствах нет физической клавиатуры, это такжеотлично.

Комментарии:

1. Что вы подразумеваете под «обновлением текущего распределения»?

2. @Paresh Mayani — чтобы изменить, какие строки видит пользователь. Идея состоит в том, чтобы делать то, что setTextFilterEnabled(true) делает на устройстве с физической клавиатурой, когда пользователь что-то вводит

Ответ №1:

Я уверен, что вы хотите реализовать что-то вроде: ListView должен обновляться в соответствии со значением, введенным пользователем, если это так, то вот пример: Android ListView с элементами сортировки в поле поиска

Комментарии:

1. У меня небольшая проблема с кодом: когда я ввожу один символ в EditText, он работает нормально, когда я пытаюсь ввести другой символ, скажем, «a», а затем «b», чем я вижу, что b записан (выглядит как тост), а строки, начинающиеся с «ab», не отображаются.показано.

Ответ №2:

Одним из решений может быть фильтрация отображаемого списка в AsyncTask, а затем обновление списка в вашем адаптере. Затем с помощью notifyDataSetChanged список обновляется, чтобы показывать только нужные вам элементы. Возможно, это не очень элегантное решение, но оно сработало для меня.

РЕДАКТИРОВАТЬ: это должно сработать

    void setTextChangedListenerToSearchBox(EditText etFilter) {

    if (etFilter == null)
        return;

    etFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
            // nothing done here
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // nothing done here
        }

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (s.toString() != null) {
                searchupdate(s.toString());
            }
        }

    });
}


void searchupdate(String s)
{
    final List<String> currentItems = new ArrayList<String>(yourCurrentlyDisplayedItems);

    (new AsyncTask<String,Void,List<String>>() {

        @Override
        protected List<String> doInBackground(String... params)
        {
            List<String> listitems = new ArrayList<String>();

            for(String item : currentItems) {
                if(item.contains(params[0])) {
                    listitems.add(item);
                }
            }
            return listitems;
        }

        @Override
        protected void onPostExecute(List<String> result)
        {
            adapter.clear();
            adapter.addAll(result);
            adapter.notifyDataSetChanged();
        }

    }).execute(s);
}