2012-07-19 17 views
0

我的任務是在過濾期間保留展開/摺疊的組。我寫自己的過濾器,如果組沒有剩下任何孩子,則刪除組。但是,羣組結束後,過濾器的文本被更改並且羣組返回,但它會被摺疊。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(); 
} 
+0

您如何設置和取消設置過濾器? – M2X 2012-07-19 18:30:44

+0

我爲你添加了我的過濾器。也許,有從適配器調用方法的可能性? ExpandableListView可以訪問展開/摺疊的所有信息,但我需要找出最佳時間。 – neworld 2012-07-19 21:18:26

回答

1

我創辦的答案。

我可以將DataSetObserver註冊到適配器,該適配器偵聽數據更改或無效。所以,我在ExpandableListView通過重寫addAdapter法註冊的觀察者:

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

    super.setAdapter(adapter); 
} 

我也需要調整了一下篩選,因爲當時的錯誤。

它工作得很好。我希望別人幫助我的經驗。

相關問題