【问题标题】:Android - cannot update listview with filtered results from edittext stringAndroid - 无法使用来自edittext字符串的过滤结果更新列表视图
【发布时间】:2012-12-11 10:01:41
【问题描述】:

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

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

例如:

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

我在EditText 中写了E,使用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”,则列表不是最初的列表,而是给我一个空列表!

你能帮我解决这个问题吗?

【问题讨论】:

  • 您是否尝试过我为您的问题提供的解决方案?
  • @PratikSharma 我从另一个答案中获取了一段代码,它的工作方式似乎与您的非常相似。看看我编辑的问题,你能帮我解决我的最后一个问题吗?
  • 我尝试了您的 publishresults 方法版本,效果很好,但是当我删除部分字符串时,我遇到了与编辑问题中报告的问题相同的问题!
  • 能否通过输入一些名称来过滤和删除字符串中的字符,将日志放入 results.countconstraint 的 publishResults 方法中?
  • 对不起,我的同事解决了这个问题,这是不同线程使用相同列表的问题。他只是克隆了这个列表并在过滤线程中使用它,等等!还是谢谢!

标签: android listview android-arrayadapter contactscontract


【解决方案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();

}

【讨论】:

  • 试过了,除了删除字符串外,效果很好,问题在编辑的问题中有描述。谢谢!
猜你喜欢
  • 2015-02-02
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多