1

編集テキストにユーザーが入力した検索文字列で電話の連絡先をフィルタリングする際に問題が発生します。

うまくフィルタリングされているように見えますが、問題は、フィルタリングされたListViewにALLCONTACTSListViewと同じ初期連絡先が含まれていることです。

例えば:

ALL CONTACTS:
A - B - C - D - E

にEを記述しEditText、を使用してTextWatcher、フィルター処理された結果はAです。

つまり、フィルタリングは適切に行われているようですが(1つの結果のみ)、リストビューのコンテンツは更新されていません。

ここにいくつかのコード:

getFilter()およびカスタムフィルター:

@Override
public Filter getFilter() 
    {
    if (mFilter == null) 
    {
        mFilter = new CustomFilter();
    }

    return mFilter;
}


private class CustomFilter extends Filter 
{
    @Override
    protected FilterResults performFiltering(CharSequence prefix) 
    {
        FilterResults results = new FilterResults();

        Log.d("PREFIX", "its ---> " + prefix);

        prefix = prefix.toString().toLowerCase();

        if(prefix != null && prefix.length()>0)
        {
            ArrayList<Contact> contatti = new ArrayList<Contact>();

            for(int i = 0; i < _app._contacts.size(); i++)
            {
                Contact current = _app._contacts.get(i);

                if(current.getContactName().toLowerCase(Locale.getDefault()).contains(prefix) /*|| current.getNumber().toLowerCase().contains(prefix)
                        || current.getEmail().toLowerCase().contains(prefix) || current.getOrganization().toLowerCase().contains(prefix)*/)
                {
                    contatti.add(current);
                    Log.d("added to contatti list: ", current.getContactName()+" - "+current.getNumber());
                }
            }

            results.count = contatti.size();
            results.values = contatti;
        }
        else
        {
            results.count = _app._contacts.size();
            results.values = _app._contacts;
        }

        return results;
    }

    @SuppressWarnings("unchecked")
        @Override
    protected void publishResults(CharSequence constraint, FilterResults results) 
    {
        ArrayList<Contact> risultatoFiltro = new ArrayList<Contact>();
        risultatoFiltro = (ArrayList<Contact>) results.values;

        MyAdapter filteredAdapter = new MyAdapter(_ctx,R.layout.listview,risultatoFiltro);

        MainActivity.lv.setAdapter(filteredAdapter);

        notifyDataSetChanged();
    }
}

編集

編集されたpublishResultsメソッド:

protected void publishResults(CharSequence constraint, FilterResults results) 
    {
        if (results.count == 0)
            notifyDataSetInvalidated();
        else
        {
            ArrayList<Contact> risultatoFiltro = (ArrayList<Contact>) results.values;

            notifyDataSetChanged();
            clear();

            //Add the items back in
            for (Iterator<Contact> iterator = risultatoFiltro.iterator(); iterator.hasNext();) 
            {
                Contact contactList = (Contact) iterator.next();
                add(contactList);
            }
        }
    }

これでフィルタリングはうまく機能しますが、一部の文字を削除してもリストが更新されません。

例:「ダニエル」と書きます。「D」以外のすべてを削除すると、リストは「ダニエル」のままになります。また、「D」を削除すると、リストは最初のリストではありませんが、空のリストが表示されます。

これを理解するのを手伝ってくれませんか。

4

1 に答える 1

1

次の方法で試してください。

@Override
public void publishResults(CharSequence constraint, FilterResults results) {

        List<T> filtered = (ArrayList<T>) results.values;
        adapter.notifyDataSetChanged();
        adapter.clear();
        if (filtered != null) {
            for (int i = 0; i < filtered.size(); i++)
                adapter.add(filtered.get(i));
        }
        adapter.notifyDataSetInvalidated();

}
于 2012-12-11T10:09:22.420 に答える