Как отобразить "нет результата" в фильтруемом ListView?

у меня есть ListView и EditText. Я реализую addTextChangedListener on EditText to фильтр the 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 (как начальный) в ListView вместо возвращенного количества результатов фильтра? The watcherAdapter.getCount() кажется, a-click поздно для отображаемого результата в ListView.
  2. как я добиваюсь, чтобы показать "No Result" на ListView когда нет результатов матча, как я печатаю на EditText?

5 ответов


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

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

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

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

publishResults(CharSequence constraint, FilterResults results)

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

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


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

 @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);
    }

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));
            }

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


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