Android - 无法使用edittext字符串中的过滤结果更新列表视图

时间:2012-12-11 10:01:42

标签: android listview android-arrayadapter contactscontract

我在使用用户在edittext中输入的搜索字符串过滤电话上的联系人时遇到了一些问题。

似乎过滤效果不错,但问题是过滤后的ListView包含与ALL CONTACTS ListView相同的初始联系人。

例如:

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

我在EditText中写了E,并使用TextWatcher,过滤后的结果为A

所以它就像过滤得好(只有一个结果),但列表视图内容还没有更新!

这里有一些代码:

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

现在过滤效果很好,但是如果我删除了一些字符,则列表不会更新!

示例:写'Daniel'。如果删除除“D”以外的所有内容,列表仍为“Daniel”!如果我删除'D',列表不是最初的列表,但它给了我一个空列表!

你能帮我搞清楚吗?

1 个答案:

答案 0 :(得分: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();

}