我在使用用户在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',列表不是最初的列表,但它给了我一个空列表!
你能帮我搞清楚吗?
答案 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();
}