1

我在通过用户在编辑文本中键入的搜索字符串过滤手机上的联系人时遇到了一些问题。

它似乎过滤得很好,但问题是过滤后的 ListView 包含与 ALL CONTACTS ListView 相同的初始联系人。

例如:

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

我将 E 写在 中EditText,使用 a TextWatcher,过滤后的结果是A

所以就好像过滤得很好(只有一个结果),但是listview内容没有更新!

这里有一些代码:

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 回答