2012-07-19 3 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

+0

내 필터를 추가했습니다. 어쩌면, 어댑터에서 메소드를 호출 할 가능성이 있습니까? ExpandableListView는 펼치기/접기에 대한 모든 정보에 액세스 할 수 있지만 가장 적합한 시간을 찾아야합니다. – neworld

답변

1

.

데이터 변경 내용을 수신하거나 무효화하는 어댑터에 DataSetObserver를 등록 할 수 있습니다. 그래서 addAdapter 방법을 재정 의하여 ExpandableListView에 관찰자를 등록 : 실수가 있었기 때문에

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

    super.setAdapter(adapter); 
} 

이 또한 내가 조금 필터를 조정할 필요가있다.

아주 잘 작동합니다. 다른 사람이 내 경험을 돕기를 바랍니다.