繁体   English   中英

按空格键后,搜索视图过滤器不起作用

[英]Searchview filter not working after I hit the space key

我不知道会发生什么,但是当我在搜索栏中输入 2 个单词的值时,我的 searchView 无法正常工作。

例如:

我的列表视图显示如下

你救我

首先

我不害臊

在搜索栏中,我想用关键字“你”搜索歌曲“你救了我”。 结果很好并显示了完全匹配,但是当我尝试输入“您保存”关键字时,结果在列表视图中没有出现任何内容。 当输入的值在 2 个单词之间有空格时,searchview 似乎不起作用。

我该如何解决这个问题?

 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });

试试这个

searchView.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId,
                                      KeyEvent event) {
            return true;
        }
    });
    addTextChangeListener();

现在创建这个方法

    private void addTextChangeListener() {
    searchView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence query, int start, int before, int count) {

            query = query.toString().trim().toLowerCase();

            final ArrayList<CityDataModel> filteredList = new ArrayList<>();



            final CharSequence finalQuery = query;
            new Thread(new Runnable() {
                @Override
                public void run() {

                    // Clear the filter list
                    filteredList.clear();

                    // If there is no search value, then add all original list items to filter list
                    if (TextUtils.isEmpty(finalQuery)) {

                        filteredList.addAll(cities);

                    } else {
                        // Iterate in the original List and add it to filter list...
                        for (CityDataModel item : cities) {
                            if (item.getCity_name().toLowerCase().contains(finalQuery.toString().toLowerCase())
                                    ) {
                                // Adding Matched items
                                filteredList.add(item);
                            }
                        }
                    }

                    // Set on UI Thread
                    ((Activity) context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // Notify the List that the DataSet has changed...
                            adapter = new SearchCityAdapter(SearchCityClass.this, filteredList);
                            recyclerSearchCity.setAdapter(adapter);


                            if (filteredList.size() == 0) {
                                tvNoCityFound.setVisibility(View.VISIBLE);
                            } else {
                                tvNoCityFound.setVisibility(View.GONE);
                            }
                        }
                    });

                }
            }).start();


        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

好的,伙计们。 这篇文章很旧,但似乎没有人有兴趣回答我的问题,所以我决定回答我的旧问题,以防有人和我有同样的问题。

非常重要:使用RecyclerView而不是ListView以获得更好的性能。

创建Recyclerview adapter并将此类Filterable实现到您的适配器。

然后添加此代码。

 @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                final String text = charSequence.toString().toLowerCase();
                List<SongsEntity> list;
                if (text.isEmpty()) {
                    list = entitySongs; //"entitySongs" is your original arraylist
                }else {
                    List<SongsEntity> songlist = new ArrayList<>();


                    for (SongsEntity song : entitySongs) {
                         if ((song.getTitle().toLowerCase().trim().contains(text))) 
                         {
                             songlist.add(new SongsEntity(song.getId(), song.getTitle(), song.getArtist(),song.getLyrics()));
                          }
                    }

                    list = songlist;
                }

                FilterResults results = new FilterResults();
                results.values = list;

                return results;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                songFiltered = (List<SongsEntity>) filterResults.values; // //"songFiltered" is your filtered arraylist
                notifyDataSetChanged();
            }
        };
    }

我不记得这个问题的确切原因,但我用上面的代码解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM