2014-11-09 6 views
0

У меня есть json array, и я поместил все элементы массива внутри списка. Мне нужен поиск этого списка. Я попробовал эту функциюlist view array filter

// Locate the EditText in listview_main.xml 
    final EditText editsearch = (EditText) findViewById(R.id.editText1); 
    // Capture Text in EditText 
    editsearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 

     } 

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

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

      String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); 
      adapter1.filter(text); 

     } 
    }); 

Но когда я пытаюсь что-нибудь типа список стал пустым

У меня есть фильтр внутри пользовательского списка адаптера, как показано ниже

// Filter Class 
     public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     movieItems.clear(); 
     if (charText.length() == 0) { 
     movieItems.addAll(movieItems); 
     } 
     else 
     { 
     for (Movie wp : movieItems) 
     { 
      if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText)) 
      { 
       movieItems.add(wp); 
      } 
     } 
    } 
    notifyDataSetChanged(); 
    } 

Как я могу исправить это?

ответ

0

Вы звоните clear до addAll, так что вы добавляете пустой список. Создание временного «filteredList» и содержать ссылку на свой «originalList»

// Filter Class 
    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     List<Movie> filteredMovies = new ArrayList<Movie>(); 
     if (charText.length() == 0) { 
      filteredMovies.addAll(originalMovieList); 
     } 
     else 
     { 
      for (Movie wp : movieItems) 
       if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText)) 
        filteredMovies.add(wp); 
     } 
     notifyDataSetChanged();  
    } 

Помните, что ваш пользовательский адаптер должен обрабатывать й filteredList и не оригинальный

+0

Большое вам спасибо, но, пожалуйста, вы можете объяснить, как обращаться с фильтрованным списком? Я отправляю свой код всего адаптера еще раз за ваш ответ –

0

Трудно сказать, что именно ваша проблема, не видя весь код вашего адаптера. Однако похоже, что вы вручную применяете метод под названием filter() в своем пользовательском адаптере? Ваш пользовательский адаптер (при условии, что он расширяет BaseAdapter) должен реализовывать интерфейс Filterable, который затем будет доступен для выполнения отфильтрованного поиска.

Это может быть затруднительно выполнить собственное решение. Я предлагаю проверить репозиторий https://github.com/JaySoyer/Advanced-Adapters. Он содержит кучу адаптеров, которые обеспечивают очень простой способ определения вашей собственной логики фильтрации. Существует также один специально для использования с JSONArrays.

0

В основном ваш отфильтрованный список отличается от основного и сохраняет все отфильтрованные результаты.

Когда вы вводите поисковый запрос, отфильтрованный список содержит все результаты. Установите этот список для адаптера, а затем вызовите notifydatasetchanged() с новым списком.