Как отобразить «Нет результата» в фильтруемом ListView? - PullRequest
6 голосов
/ 27 мая 2011

У меня есть ListView и EditText.Я использую addTextChangedListener для EditText до фильтра ListView содержимого.

leftList.setTextFilterEnabled(true);
et_search.addTextChangedListener(filterTextWatcher);

, а затем TextWatcher имеет вид:

private TextWatcher filterTextWatcher = 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) {

         if (watcherAdapter==null) {
             return;
         }

         watcherAdapter.getFilter().filter(s);

         Log.e(TAG, "OnTextChange: " + s + " start: " + start +
         " before: " + before + " count: " + count + " adapter: " +
         watcherAdapter.getCount());    

    }
};

Условие:

  1. У меня есть 10 пунктов в ListView.

Вопрос:

  1. Когда я впервые набираю первый символ, почему watcherAdapter.getCount() возвращает 10 (как начальное значение) в ListVie w вместо числа возвращенных результатов фильтрации?watcherAdapter.getCount() кажется запоздалым щелчком для отображаемого результата в ListView.
  2. Как я могу показать "No Result" в ListView, когда нет результатов совпадений, когда я печатаю на EditText?

Ответы [ 5 ]

3 голосов
/ 04 мая 2012

Чистее добавить TextView к вашему макету, выше или ниже списка, где вы показываете сообщение:

<TextView 
android:id="@+id/noResultsFoundView" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="No result"
android:visibility="gone"
/>

Когда у вас есть результаты, вы устанавливаете видимость GONE. Если у вас нет результатов, вы устанавливаете его в VISIBLE.

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

publishResults(CharSequence constraint, FilterResults results)

из фильтра, где в параметре FilterResults передается правильное, обновленное число.

В publishResults вы вызываете метод из действия, чтобы обновить видимость noResultsFoundView. То, как вы получаете доступ к активности, зависит от того, где находится ваш фильтр. Если это во внутреннем классе деятельности, то это легко. В противном случае вы, например, передаете действие в качестве параметра для создания экземпляра адаптера и сохраняете его как переменную intance.

2 голосов
/ 21 декабря 2016

Конечно, в фильтруемом списке нет результатов. Пожалуйста, укажите ниже код

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.home, menu);

        MenuItem searchItem = menu.findItem(R.id.menu_search);
        final AppCompatEditText searchView = (AppCompatEditText) MenuItemCompat.getActionView(searchItem);
        if (searchView != null) {
            searchView.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
                    if(mAdapter==null)
                        return;
                        mAdapter.getFilter().filter(arg0.toString());
                        if(mAdapter.getItemCount()<1){
                            listView.setVisibility(View.GONE);
                            txtEmptyList.setVisibility(View.VISIBLE);
                        }else{
                            listView.setVisibility(View.VISIBLE);
                            txtEmptyList.setVisibility(View.GONE);
                        }
                }

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

                @Override
                public void afterTextChanged(Editable arg0) {

                }
            });
        }
        MenuItemCompat.setOnActionExpandListener(searchItem, this);
        MenuItemCompat.setActionView(searchItem, searchView);
        super.onCreateOptionsMenu(menu, inflater);
    }
1 голос
/ 27 мая 2011
if(!fillMaps.isEmpty())
            {
            SimpleAdapter adapter = new SimpleAdapter(
                    WorldClockActivity.this, fillMaps, R.layout.grid_item,
                    from, to);
            lv1.setAdapter(adapter);
            }
            else
            {      String[] emptyList = new String[] {"No record found"};
            lv1.setAdapter(new ArrayAdapter<String>(WorldClockActivity.this,R.layout.list_item, emptyList));
            }

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

0 голосов
/ 07 декабря 2011

Единственное решение, которое я использую в конце концов, - это сделать мой пользовательский фильтр поиска .... Разделить слова, разбить их на токены и, если они совпадают, поместить их в массив как адаптер для Списка.И работает так, как я хочу

...