简体   繁体   English

如何分离SearchView项目以过滤RecyclerView

[英]How to separate SearchView items to filter a RecyclerView

Currently, I'm working on an activity that has a RecyclerView and SearchView in it.Now the RecyclerView and SearchView are working fine but there is a problem that I don't know how to resolve, you see in the searchView part we were a task to make a SearchView that accepts 2 or more searchItems that must be separated by a comma or space in order to filter the recyclerview again if the second searchitem matches an item in the RecyclerView, for example I type in searchitem "Big" i'll need to separate it again with another searchitem like "Black" 目前,我正在从事一个具有RecyclerView和SearchView的活动。现在RecyclerView和SearchView可以正常工作,但是有一个我不知道如何解决的问题,在searchView部分我们看到了如果第二个searchitem与RecyclerView中的某个项目匹配,则使SearchView接受2个或多个必须用逗号或空格分隔的searchItem,以便再次过滤recyclerview的任务,例如,我输入searchitem“ Big”,需要使用另一个搜索项(例如“黑色”)再次将其分开

here is the code for the SearchView 这是SearchView的代码

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pet_book_main);

        if(savedInstanceState != null){
           mSearchString=savedInstanceState.getString(SEARCH_KEY);
        }

        pet_title=(TextView)findViewById(R.id.pet_book_title);
        petbook=(RecyclerView)findViewById(R.id.pet_book_pet);
        navbot=(BottomNavigationView) findViewById(R.id.petbook_navbot);
        toolbar=(Toolbar)findViewById(R.id.petbook_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        toolbar.setTitle("");
        linearLayoutManager=new LinearLayoutManager(this);
        petbook.setHasFixedSize(true);
        petbook.setLayoutManager(linearLayoutManager);
        refresh();
        disableShiftMode(navbot);
}

     @Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        MenuInflater menuInflater= getMenuInflater();
        menuInflater.inflate(R.menu.petbook_searck,menu);
        searchItem=menu.findItem(R.id.pet_book_search_mode);
        searchView =(SearchView)MenuItemCompat.getActionView(searchItem);

        if (mSearchString != null && !mSearchString.isEmpty()) {
            searchItem.expandActionView();
            searchView.setQuery(mSearchString, true);
            searchView.clearFocus();
        }
        search(searchView);
        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                pet_title.setVisibility(View.INVISIBLE);
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                pet_title.setVisibility(View.VISIBLE);
                return true;
            }
        });
        return true;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mSearchString = searchView.getQuery().toString();
        outState.putString(SEARCH_KEY, mSearchString);
    }

      public void search(android.support.v7.widget.SearchView search)
    {
        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                newText=newText.toLowerCase();
                newList=new ArrayList<>();
                for(petbook_getItem items : bookItem){
                    String pets=items.getPet_name().toLowerCase();
                    if(pets.contains(newText))
                        newList.add(items);
                }
                adapter.filterSearch(newList);
                adapter.notifyDataSetChanged();
                return true;
            }
        });
    }

This code handles user input in search which can be multiple comma separated search items : 此代码处理搜索中的用户输入,该输入可以是multiple comma separated search items

search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    .....


    @Override
    public boolean onQueryTextChange(String newText) {
        newText = newText.toLowerCase();

        // remove leading comma or space
        String string2 = newText.replaceAll("^[,\\s]+", "");

        // return early for invalid input (empty)
        if (string2.isEmpty()) {
            return true;
        }

        // split by comma & space if any
        List<String> inputList = Arrays.asList(string2.split("[,\\s]+"));

        newList = new ArrayList<>();

        for (petbook_getItem items : bookItem){
            String pets = items.getPet_name().toLowerCase();

            // Check for matching by looping through each search items
            for (String inputTxt : inputList) {
                if (pets.contains(inputTxt)) {
                    newList.add(items);    
                    break;
                }
            }
        }

        adapter.filterSearch(newList);
        adapter.notifyDataSetChanged();
        return true;
    }
});

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

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