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();
}
您如何設置和取消設置過濾器? – M2X 2012-07-19 18:30:44
我爲你添加了我的過濾器。也許,有從適配器調用方法的可能性? ExpandableListView可以訪問展開/摺疊的所有信息,但我需要找出最佳時間。 – neworld 2012-07-19 21:18:26