【Android】(Expandable)ListViewで各データごとに表示を切り替える

以前作ったやつを使っているうちに、「データの表示も動的に変更出来ないもんかなぁ…。」と思うようになり、まぁクロージャ使えば普通に出来るよね、ってことで、作ります。

親要素と子要素に追加するコード

要はExpandableListAdapter#getGroupViewExpandableListAdapter#getChildViewで返してくれるViewを作るFunctionをデータが持ってりゃいいんだよね、って話です。

public class ExpandableParent<EventArg> implements Serializable {
    //以下、色々と省略
    transient protected R5<View, ExpandableParent<EventArg>, LayoutInflater, Boolean, View, ViewGroup> viewProvider;
    
    public R5<View, ExpandableParent<EventArg>, LayoutInflater, Boolean, View, ViewGroup> getViewProvider() {
        return this.viewProvider;
    }
}

public class ExpandableChild<EventArg> implements Serializable {
    transient protected R5<View, ExpandableChild<EventArg>, LayoutInflater, Boolean, View, ViewGroup> viewProvider;
    
    public R5<View, ExpandableChild<EventArg>, LayoutInflater, Boolean, View, ViewGroup> getViewProvider() {
        return this.viewProvider;
    }
}

setterを作るよりはコンストラクタで渡してしまったほうがいいと思います。コードは割愛。

Adapterに追加するコード

後はまぁ、呼び出してしまえばいい話であって…。

public class EventExpandableAdapater<EventArg> extends BaseExpandableListAdapter {

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild
            , View convertView, ViewGroup parent) {

        ExpandableParent<EventArg> p = _parents.get(groupPosition);
        if(!p.hasChild()) return null;

        ExpandableChild<EventArg> child = p.getChildren().get(childPosition);

        return child.getViewProvider().call(child, _layoutInflater, isLastChild, convertView, parent);
    }

    @Override
    public View getGroupView(int groupPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ExpandableParent<EventArg> p = _parents.get(groupPosition);
        return p.getViewProvider().call(p, _layoutInflater, isLastChild, convertView, parent);
    }

}

呼び出し側のコードは割愛します。(今までgetGroup/ChildViewでやってたことをそのまま記述するだけです。)

まとめ

作ってはみたものの、コストが物凄く高そうなので、あんまり大量のデータを表示するには向いてない気がします。ちょっとしたメニュー画面なんかには使えるんじゃないでしょうか。

また、ListViewでも全く同じことが出来ます。