(続)ListViewのEmptyViewが使えないので代替案を考える

これの続き

ViewTypeで分けてみる

前に作った方法でやるとどうしても無理矢理っぽい。なので、ViewTypeにEmptyを追加して0件なら表示するように変更してみた。

public class ListAdapter extends ArrayAdapter {

    // 表示するViewType達
    private enum ViewType {
        NORMAL(0),
        EMPTY(1);

        private int key;

        ViewType(int key) {
            this.key = key;
        }

        public int getKey() {
            return key;
        }

        public static ViewType getByKey(int key) {
            ViewType ret = null;
            for (ViewType viewType : values()) {
                if (key == viewType.getKey()) {
                    ret = viewType;
                    break;
                }
            }
            return ret;
        }
    }

    @Override
    public boolean isEmpty() {
        return (super.getCount() == 0 && mEmptyView == null) ? true : super.isEmpty();
    }

    @Override
    public int getCount() {
        // 0件かつEmptyViewが設定されていたらEmptyView分の1を返答する
        return (super.getCount() == 0 && mEmptyView != null) ? 1 : super.getCount();
    }

    @Override
    public int getViewTypeCount() {
        return ViewType.values().length;
    }

    @Override
    public int getItemViewType(int position) {
        // 0件かつEmptyViewが設定されていたらEmptyViewになる
        return (position == 0 && super.getCount() == 0 && mEmptyView != null) ?
                ViewType.EMPTY.getKey() : ViewType.NORMAL.getKey();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        switch (ViewType.getByKey(getItemViewType(position))) {
            case NORMAL:
                view = getNormalView(position, convertView, parent);
                break;
            default:
                // defaultになることはない。
            case EMPTY:
                view = getEmptyView(position, convertView, parent);
                break;
        }

        return view;
    }

    private View getEmptyView(int position, View convertView, ViewGroup parent) {
        // ここでEmptyViewを作成する
        return view;
    }

    private View getNormalView(int position, View convertView, ViewGroup parent) {
        // ここで通常のViewを作成する
        return view;
    }
}

まとめ

前回よりもこっちのほうがいいと思う。convertViewで再利用もちゃんとできるしいい感じ。setEmptyViewとかも合わせてOverrideした方がいいかも。