0

私の仕事は、フィルター中に展開/折りたたまれたグループを保持することです。グループに子が残っていない場合にグループを削除する独自のフィルターを作成します。ただし、グループがなくなった後、フィルターのテキストが変更され、グループが戻ってきますが、折りたたまれます。

そのため、展開/折りたたみの状態をグループ オブジェクトに保存します。したがって、これらの状態を適切なタイミングで適用する必要があります。

私の試みがあります:

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();
}
4

1 に答える 1

1

私は答えを設立しました。

データの変更または無効化をリッスンするアダプターに DataSetObserver を登録できます。そこで、addAdapter メソッドをオーバーライドして、ExpandableListView にオブザーバーを登録します。

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

    super.setAdapter(adapter);
}

また、間違いがあったため、フィルターを少し調整する必要があります。

それは非常にうまく機能します。他の誰かが私の経験を助けてくれることを願っています。

于 2012-07-20T08:07:48.520 に答える