1

曲のタイトルとアーティストでlistViewをフィルタリングしたい。

現在、私は曲のタイトルに有効なフィルターを持っています。しかし、曲のタイトルとアーティストを同時にフィルターする方法がわかりません。

これは私の活動です:

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) {
    }
});

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();
    }
}

「inputSongArtist」に addTextChangedListener を追加したいと思います。タイトルとアーティストの両方を同時にフィルターするにはどうすればよいですか?

4

1 に答える 1

6

以下のメソッドをカスタム アダプターに追加するだけです。

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();
}

そしてより

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapterContactList.filter(s.toString());
}
于 2013-09-11T07:16:12.947 に答える