AutoCompleteTextView过滤器不显示已过滤的列表

时间:2014-06-22 23:04:58

标签: java android autocompletetextview

我的AutoCompleteTextView自定义适配器中的过滤器出现问题。它不想显示已过滤的列表。我知道过滤器会过滤我的列表,因为例如我有" Paris / FRANCE"在我的列表中,当我在AutoCompleteTextView中键入它时,列表仍然显示但它继续显示完整列表而不是筛选列表。如果我键入" Pary",则在键入" Y"之后列表消失。信件。这就是我知道过滤器有效的原因。

这是我的代码:

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable
{
    private ArrayList<String> data;

    public AutoCompleteAdapter(Context context, int resource, ArrayList<String> objects) 
    {
        super(context, resource, objects);
        data = objects;
    }



@Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = convertView;

        if (v == null) 
        {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v = vi.inflate(R.layout.item, null);
        }

        String s = getItem(position);

        if (s != null) 
        {
            TextView city = (TextView)v.findViewById(R.id.city);
            TextView country = (TextView)v.findViewById(R.id.country);

            String[] split = s.split("/");
            city.setText(split[0]);
            country.setText(split[1]);
        }

        return v;

    }

    @Override
    public Filter getFilter()
    {
        return new Filter()
        {

            @Override
            protected FilterResults performFiltering(CharSequence prefix)
            {
                FilterResults fr = new FilterResults();
                if(prefix != null)
                {
                    ArrayList<String> filtered = new ArrayList<String>();
                    for(String s : data)
                    {
                        if(s.toLowerCase().contains(prefix.toString().toLowerCase()))
                        {
                            filtered.add(s); 
                        }
                    }

                    fr.values = filtered;
                    fr.count = filtered.size();
                }
                return fr;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence contraint, FilterResults results) 
            {
                data = (ArrayList<String>)(results.values);

                if(results != null && results.count > 0) 
                {
                    notifyDataSetChanged();
                }
                else 
                {
                    notifyDataSetInvalidated();
                }
            }

        };
    }
    }

请原谅我的英语不好,希望你能帮助我。感谢

1 个答案:

答案 0 :(得分:2)

您永远不会过滤基类,因此如果没有进行过滤,那么您不会覆盖的方法的行为方式与它们相同。

E.g。 getCount()仍然使用旧列表,因为您替换了对data字段中列表的引用,而不是ArrayAdapter基类中的引用。

如果您修改data而不是替换它,它应该有效:

替换

data = (ArrayList<String>)(results.values);

data.clear();
data.addAll((ArrayList<String>)results.values);

但是,您可能希望在某处保留原始列表的备份,以防有人从您用于过滤的字符串中删除字母(因此过滤过滤后的列表将不再产生与过滤原始列表相同的结果直接过滤当前的过滤器。