Android ExpandableListView确定何时应用筛选文本
我的任务是在筛选期间保持展开/折叠的组。我编写了自己的过滤器,若组中并没有任何剩余的子级,它将删除组。但在组消失后,过滤器的文本被更改,组返回,但它将被折叠 因此,我保存展开/折叠状态以对对象进行分组。所以我只需要在适当的时候应用这些状态 这是我的尝试:Android ExpandableListView确定何时应用筛选文本,android,filter,expandablelistview,Android,Filter,Expandablelistview,我的任务是在筛选期间保持展开/折叠的组。我编写了自己的过滤器,若组中并没有任何剩余的子级,它将删除组。但在组消失后,过滤器的文本被更改,组返回,但它将被折叠 因此,我保存展开/折叠状态以对对象进行分组。所以我只需要在适当的时候应用这些状态 这是我的尝试: class SubjectGroupList extends ExpandableListView implements OnGroupCollapseListener, OnGroupExpandListener{ public S
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);
}
}
但这根本不起作用。永远不会调用FilterComplete方法
我必须找到另一种方法,在重新喷漆之前确定何时应用过滤器
也许有人知道?谢谢
编辑:
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);
}
}
我的过滤器:
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);
}
}
class-GroupFilter扩展了过滤器{
私有主题组适配器;
公共组筛选器(SubjectGroupAdapter适配器){
this.adapter=适配器;
}
@凌驾
受保护过滤器结果性能过滤(字符序列){
FilterResults结果=新的FilterResults();
result.count=0;
ArrayList组=新的ArrayList();
s=s.toString().toLowerCase();
for(主题组:adapter.ori){
SubjectGroup ng=新的SubjectGroup(group.name,group.id);
int=0;
for(主题项:组){
如果(s==null | | s.length()==0 | | item.name.toLowerCase().contains){
添加(新的主题项(item.name,item.id));
结果:count++;
创建++;
}
}
如果(大于0)
添加(ng);
}
结果:值=组;
返回结果;
}
@凌驾
受保护的无效publishResults(字符序列、FilterResults结果){
过滤器((ArrayList)result.values);
}
}
*以及接受过滤数据的适配器的方法*:
受保护的空过滤器(ArrayList组){
这个组=组;
notifyDataSetionValidated();
}
我找到了答案
我可以将DataSetObserver注册到适配器,该适配器监听数据更改或使其失效。因此,我通过重写addAdapter方法在ExpandableListView中注册观察者:
@Override
public void setAdapter(ExpandableListAdapter adapter) {
adapter.registerDataSetObserver(new DataSetObserver() {
public void onInvalidated() {
fixCollapse();
}
});
super.setAdapter(adapter);
}
我还需要调整一点过滤器,因为有错误
它工作得很好。我希望其他人能帮助我的体验。您如何设置和取消设置过滤器?我为您添加了我的过滤器。也许,有可能从适配器调用方法?ExpandableListView可以访问展开/折叠的所有信息,但我需要找出展开/折叠的最佳时间。