Фильтрация ListView - не так, как я думал, что это будет работать ../ - PullRequest
0 голосов
/ 17 мая 2011

надеялся, что вы сможете помочь мне с проблемой, с которой я столкнулся. У меня есть просмотр списка, который фильтруется в поле ввода. Я полагал, что он будет фильтровать, основываясь на тексте в тексте редактирования, через любую часть текста в просмотре списка. Поэтому, если у меня есть три элемента в списке: «Кекс», «Пончик», «Эклер» и «Фройо», и я набрал «cl», он ничего не вернет ... но если бы я набрал «ecl» ", это вернуло бы" Эклер ". Извините, если я сформулировал это ужасно ... это немного сложно объяснить. Вот мой код:

private EditText ed;
private String lv_arr[]={"Cupcake","Donut","Eclair","Froyo"};
ArrayAdapter<String> arrad;

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.search);

     ed = (EditText) findViewById(R.id.edit);
     ListView list = (ListView) findViewById(R.id.listviewtest);
     arrad =  new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr);
     list.setAdapter(arrad);
     list.setTextFilterEnabled(true);

     ed.addTextChangedListener(new TextWatcher() {
         @Override
         public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3) {
             SearchByName.this.arrad.getFilter().filter(arg0);
         }

         @Override
         public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3) {

        }

        @Override
        public void afterTextChanged( Editable arg0) {

        }
   });
}

1 Ответ

2 голосов
/ 17 мая 2011

если вы посмотрите на исходный код для массива-адаптера, он отфильтрует только первые буквы любого данного слова в вашем элементе списка (поэтому, учитывая элемент «eclair donut», он будет соответствовать «ecl» или «don», ноне "воздух" или "орех": вот соответствующий код из ArrayAdapter.java

      for (int i = 0; i < count; i++) {
            final T value = values.get(i);
            final String valueText = value.toString().toLowerCase();

            // First match against the whole, non-splitted value
            if (valueText.startsWith(prefixString)) {
                newValues.add(value);
            } else {
                final String[] words = valueText.split(" ");
                final int wordCount = words.length;

                for (int k = 0; k < wordCount; k++) {
                    if (words[k].startsWith(prefixString)) {
                        newValues.add(value);
                        break;
                    }
                }
            }
        }

, если вы хотите отфильтровать любой экземпляр вашего шаблона в середине слова, вам нужно написатьваш собственный адаптер. который реализует Filterable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...