Android: addTextChangedListener не работает должным образом

Я хочу реагировать на то, что пользователь печатает внутри EditText, поэтому я использовал метод addTextChangedListener. Когда пользователь вводит один символ, запускается код onTextChanged, и все в порядке. Так что если, например, пользователь введет «a», тогда onTextChanged начнет запускаться.

Но если пользователь вводит другой символ, например b , onTextChanged не вызывается.

(текст в EditText теперь должен быть "ab")

Код:

  et = (EditText)findViewById(R.id.edittextsearch);
  et.addTextChangedListener(new TextWatcher() 
  {

      public void afterTextChanged(Editable s){}
      public void beforeTextChanged(CharSequence s, int start, int count,int after){}
      public void onTextChanged(CharSequence s, int start, int before,int count)
      {
          int i = 0;
          textlength=et.getText().length();
          arr_sort.clear();
          for(i=0;i<3;i++)
          {
              if(textlength<=your_array_contents[i].length())
              {
                  if(et.getText().toString().equalsIgnoreCase((String) your_array_contents[i].subSequence(0, textlength)))
                  {
                      arr_sort.add(your_array_contents[i]); 
                  }
              }
          }
          lv.setAdapter(new ArrayAdapter<String>(GroupsActivity.this,
                    android.R.layout.simple_list_item_multiple_choice, arr_sort)); 
      }

  });

Помощь приветствуется!


person Belgi    schedule 03.11.2011    source источник
comment
Вычислите и запишите длину строки et в onTextChanged(), закомментировав на данный момент другой код. Я думаю, проблема только в вашем коде.   -  person Hiral Vadodaria    schedule 03.11.2011
comment
@Hiral - я тебя не понимаю. что вы имеете в виду в вычислении и регистрации длины строки et в onTextChanged(), в чем проблема, которую вы видите?   -  person Belgi    schedule 03.11.2011
comment
@user370305 - посмотрите мой комментарий к ответу Adil Soomro (проблема в посте исправлена, но есть небольшая проблема с поведением (описание в комментарии)   -  person Belgi    schedule 03.11.2011


Ответы (2)


Из вашего кода я понял, что вы хотите отфильтровать ListView.

Вместо того, чтобы делать фильтр самостоятельно, вы должны использовать listView.setFilterText(String).

Вот так:

добавьте свой адаптер в первый и один раз.

lv.setAdapter(new ArrayAdapter<String>(GroupsActivity.this,
                    android.R.layout.simple_list_item_multiple_choice, your_array_contents));

а затем добавьте TextWatcher:

txtFilter.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {
        if(s.length()==0){
            lv.clearTextFilter();
        }
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){
    }
    public void onTextChanged(CharSequence s, int start, int before, int count)
    {
        lv.setTextFilterEnabled(true);
        lv.setFilterText(s.toString());
    }
});
person Adil Soomro    schedule 03.11.2011
comment
Это отлично работает! большое спасибо!. Когда я набираю ab, я вижу в части кнопки экрана текст ab (выглядит как тост) [я не говорю о EditText]. Вы знаете, как это отключить? - person Belgi; 03.11.2011
comment
@Belgi: это поведение по умолчанию. Мы не можем это изменить. - person Adil Soomro; 03.11.2011
comment
@Adil Soomro - возможно, глупый вопрос, но почему появляется сообщение? потому что даже когда я отфильтровал себя, он все равно показывал текст ниже - person Belgi; 03.11.2011

Попробуйте так

inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text

            MainActivity.this.adapter.getFilter().filter(cs.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }
    });
person Lahiru Maduranga    schedule 16.09.2015