Ubaid Tanoli
Ubaid Tanoli

Reputation: 173

Search view onQueryTextChange issue

I implemented a search view, that searches from recycler view & update recycler accordingly. When It doesn't matches any item I am showing another layout "No Record" and set recycler view visibility to GONE. Suppose recycler view contains an item with title "judge" and when I type first two letters "ju", it updates recycler view with judge on top.

Now the problem is:

  1. When I type "juz" it should show NoRecord but it is showing blank white screen.
  2. When I type "juzm" it show NoRecord and hide recycler view that is working good but when I backspace search text to "juz" it show NoRecord, again backspace "ju" it show NoRecord and again backspace "j" it shows that item.

Search View method

@Override
public boolean onQueryTextChange(String query) {
    newsListAdapter.getFilter().filter(query);
    if (newsListAdapter.getItemCount() > 0) {
        listRecyclerView.setVisibility(View.VISIBLE);
        noRecord.setVisibility(View.GONE);
    } else {
        listRecyclerView.setVisibility(View.GONE);
        noRecord.setVisibility(View.VISIBLE);

    }
    return false;
}

Filter Method of adapter

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                filteredNewsList = newsList;
            } else {
                List<News.ArticlesBean> filteredList = new ArrayList<>();
                for (News.ArticlesBean row : newsList) {
                    if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(row);
                    }
                }

                filteredNewsList = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredNewsList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            filteredNewsList = (ArrayList<News.ArticlesBean>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

Upvotes: 1

Views: 747

Answers (1)

Ubaid Tanoli
Ubaid Tanoli

Reputation: 173

This worked

@Override
public boolean onQueryTextChange(String query) {
    Filter.FilterListener listener = new Filter.FilterListener() {
        @Override
        public void onFilterComplete(int count) {
            if (newsListAdapter.getItemCount() <=0) {
                listRecyclerView.setVisibility(View.GONE);
                noRecord.setVisibility(View.VISIBLE);
            } else {
                listRecyclerView.setVisibility(View.VISIBLE);
                noRecord.setVisibility(View.GONE);
            }
        }
    };
    newsListAdapter.getFilter().filter(query, listener);
    return false;
}

Upvotes: 1

Related Questions