ExpandableListView确定何时应用过滤器文本

时间:2012-07-19 13:44:06

标签: android filter expandablelistview

我的任务是在过滤期间保持展开/折叠组。我编写了自己的过滤器,如果小组没有留下任何孩子,则会移除该组。但是在群组消失之后,过滤器的文本会被更改并且群组会返回,但它会被折叠。

所以我将展开/折叠状态保存到组对象。所以我只需要在适当的时候应用这些状态。

有我的尝试:

class SubjectGroupList extends ExpandableListView implements OnGroupCollapseListener, OnGroupExpandListener{

    public SubjectGroupList(Context context) {
        super(context);
    }

    public void onGroupExpand(int groupPos) {
        SubjectGroup group = (SubjectGroup)getExpandableListAdapter().getGroup(groupPos);
        group.expanded = true;
    }

    public void onGroupCollapse(int groupPos) {
        SubjectGroup group = (SubjectGroup)getExpandableListAdapter().getGroup(groupPos);
        group.expanded = false;
    }

    @Override 
    public void onFilterComplete(int count) {
        fixCollapse();

        super.onFilterComplete(count);
    }

    private void fixCollapse() {
        Log.d("SubjectGroupList", "fix collapse");

        SubjectGroupAdapter adapter = (SubjectGroupAdapter)getExpandableListAdapter();
        int i = adapter.getGroupCount();
        while (--i >= 0)
            if (adapter.getGroup(i).expanded)
                expandGroup(i);
            else
                collapseGroup(i);
    }
}

但这根本不起作用。方法 onFilterComplete 永远不会被调用。

我必须找到另一种方法来确定,在重新绘制之前应用过滤器。

也许有人知道吗?感谢。

修改

我的过滤器:

class GroupFilter extends Filter {
    private SubjectGroupAdapter adapter;

    public GroupFilter(SubjectGroupAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    protected FilterResults performFiltering(CharSequence s) {
        FilterResults result = new FilterResults();
        result.count = 0;

        ArrayList<SubjectGroup> groups = new ArrayList<SubjectGroup>();

        s = s.toString().toLowerCase();

        for (SubjectGroup group : adapter.ori) {
            SubjectGroup ng = new SubjectGroup(group.name, group.id);

            int founded = 0;
            for (SubjectItem item : group) {
                if (s == null || s.length() == 0 || item.name.toLowerCase().contains(s)) {
                    ng.add(new SubjectItem(item.name, item.id));
                    result.count++;
                    founded++;
                }
            }

            if (founded > 0)
                groups.add(ng);
        }

        result.values = groups;

        return result;
    }

    @Override
    protected void publishResults(CharSequence s, FilterResults result) {
        adapter.filter((ArrayList<SubjectGroup>) result.values);
    }
}

* 接受过滤数据的适配器方法*

protected void filter(ArrayList<SubjectGroup> groups) {
    this.groups = groups;
    notifyDataSetInvalidated();
}

1 个答案:

答案 0 :(得分:1)

我找到了答案。

我可以将DataSetObserver注册到Adapter,它会监听数据更改或无效。所以我通过重写addAdapter方法在ExpandableListView中注册观察者:

@Override
public void setAdapter(ExpandableListAdapter adapter) {
    adapter.registerDataSetObserver(new DataSetObserver() {
        public void onInvalidated() {
            fixCollapse();
        }
    });

    super.setAdapter(adapter);
}

另外我需要调整一下Filter,因为存在错误。

效果很好。我希望其他人帮助我的经验。