Android Action Bar Search: how to filter a list by list item property?

I have a list view with a list item that has multiple text views and a checkbox. Using the search in the search bar, I need to filter the list using a text view.

This is my list that I need to filter by Priority.

enter image description here

This is the method that I used to filter the list from the data adopter.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);   

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() 
        {
            @Override
            public boolean onQueryTextChange(String newText) 
            {
                // this is your adapter that will be filtered
                dataAdapter.getFilter().filter(newText);
                System.out.println("on text chnge text: "+newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query) 
            {
                // this is your adapter that will be filtered
                dataAdapter.getFilter().filter(query);
                System.out.println("on query submit: "+query);
                return true;
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);

        return super.onCreateOptionsMenu(menu);

}

I installed dataAdopter in my list, which contains several elements, i.e. 3 text views and a checkbox.

// create an ArrayAdaptar from the String Array
    dataAdapter = new MyCustomAdapter(this, R.layout.task_info, taskList);
    listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
    listView.setAdapter(dataAdapter);

But when I install the adapter as follows; using only a string array of values, filtering occurs without any problems.

String[] dataArray = new String[] {"High","Medium", "Low", "Medium", "High", "Low","High"};
listView = (ListView) findViewById(R.id.listview);
myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,  dataArray);
listView.setAdapter(myAdapter);

- , ? .

+4
1

. Filterable ( Filterable). getFilter .

@Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                List<Object> filteredResult = getFilteredResults(charSequence);

                FilterResults results = new FilterResults();
                results.values = filteredResult;
                results.count = filteredResult.size();

                return results;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                listaFiltrada = (ArrayList<Documento>) filterResults.values;
                MyAdapter.this.notifyDataSetChanged();
            }


            private ArrayList<Object> getFilteredResults(CharSequence constraint){
                if (constraint.length() == 0){
                    return  listaDocumentos;
                }
                ArrayList<Object> listResult = new ArrayList<Object>();
                for (Object obj : listaTotal){
                    if (condition){
                        listResult.add(obj);
                    }
                }
                return listResult;
            }
        };
    }

, onCreateOptionsMenu EditText () :

final EditText editText = (EditText) menu.findItem(R.id.menu_buscar).getActionView();
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                if (myAdapter != null) {
                    myAdapter.getFilter().filter(charSequence);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

, :)

+3

Source: https://habr.com/ru/post/1546952/


All Articles