为对象标题创建BaseAdapter的getFilter?

时间:2013-06-26 19:37:01

标签: android baseadapter

我正在使用CardsUI创建ListView,并且我计划使用getFilter()创建搜索。每张卡片都有title可通过getTitle()访问。我见过的getFilter的每个例子都是针对Strings的。有没有人知道我是如何使用getFilter()来匹配getTitle()返回的标题并返回标题与给定字符串匹配的对象列表的好例子(或者可以提供一个很好的例子)?

感谢。

1 个答案:

答案 0 :(得分:3)

我在我的应用程序中实现了这种功能。

简要说明。 实现自己的扩展Filter的类,就像下一个类一样:

private class PlanetFilter extends Filter {
@Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        // We implement here the filter logic
        if (constraint == null || constraint.length() == 0) {
            // No filter implemented we return all the list
            results.values = planetList;
            results.count = planetList.size();
        }
        else {
            // We perform filtering operation
            List<Planet> nPlanetList = new ArrayList<Planet>();

            for (Planet p : planetList) {
                if (p.getName().toUpperCase().startsWith(constraint.toString().toUpperCase()))
                    nPlanetList.add(p);
            }

            results.values = nPlanetList;
            results.count = nPlanetList.size();

        }
        return results;
    }
}

在基础适配器中实现Filterable接口,它必须实现getFilter()方法:

@Override
public Filter getFilter() {
    if (planetFilter == null)
        planetFilter = new PlanetFilter();

    return planetFilter;
}

要将所有内容绑定在一起,请在textWatcher上使用edittext,然后输入文字。

editTxt.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        System.out.println("Text ["+s+"]");
        aAdpt.getFilter().filter(s.toString());                           
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

该代码来自下一个tutorial