1

I want to filter a listView on song title and artist.

Currently I have a working filter on song title. But I can't figure out how to filter on song title and artist at the same moment.

This is my activity:

listView.setTextFilterEnabled(true);
inputSongTitle.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        adapterCorrectSong.getFilter().filter(cs);
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                  int arg3) {
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

I use this code in my ArrayAdapter:

@Override
public Filter getFilter() {
    if (songFilter == null){
        songFilter  = new SongFilter();
    }
    return songFilter;
}

private class SongFilter extends Filter
{
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        if(constraint != null && constraint.toString().length() > 0)
        {
            ArrayList<CorrectSongResponse> filteredItems = new ArrayList<CorrectSongResponse>();

            for(int i = 0, l = allModelItemsArray.size(); i < l; i++)
            {
                CorrectSongResponse m = allModelItemsArray.get(i);
                if(m.getTitle().toLowerCase().contains(constraint.toString())) {
                    filteredItems.add(m);
                }
            }
            result.count = filteredItems.size();
            result.values = filteredItems;
        }
        else
        {
            synchronized(this)
            {
                result.values = allModelItemsArray;
                result.count = allModelItemsArray.size();
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        filteredModelItemsArray = (ArrayList<CorrectSongResponse>)results.values;
        notifyDataSetChanged();
        clear();
        for(int i = 0, l = filteredModelItemsArray.size(); i < l; i++)
            add(filteredModelItemsArray.get(i));
        notifyDataSetInvalidated();
    }
}

I now want to add an addTextChangedListener to "inputSongArtist". How can I filter both on Title and Artist at the same time?

1 Answer 1

6

Just add the below method in your custom adapter.

public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    arrData.clear();
    if (charText.length() == 0) {
        arrData.addAll(arrDataFilter);
    } else {
        for (ContactMyDataClass cMDC : arrDataFilter) {
            if(cMDC.getContactName().toLowerCase(Locale.getDefault()).contains(charText)){
                arrData.add(cMDC);
            }
        }
    }
    notifyDataSetChanged();
}

and than

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapterContactList.filter(s.toString());
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.