読者です 読者をやめる 読者になる 読者になる

2016/12/28の30分 Kotlinメモ🐮

Kotlin

2016/12/28の30分 Kotlinメモ🐮

Kotlinスタートブック -新しいAndroidプログラミング を引き続き読んでる。

ざっくりKotlinの概要は終わったので、Androidアプリ組んでみるところ読んでる。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

んで、今日からはKotlinでAndroid版 雑雑Qiita Clientを作っていく。

github.com

書くことは減りそうだけど、書いていく上で気づいたこととかあれば書いていくかなー

Kotlin版 BindableAdapter

ListAdapterを便利にするBaseクラスとして使ってるBindableAdapterをKotlinで書き直した。

abstract class BindableAdapterKt<T>(context: Context, episodeList: List<T>) : ArrayAdapter<T>(context, -1, episodeList) {

    private val inflater by lazy {
        LayoutInflater.from(context)
    };

    override fun getView(position: Int, view: View?, parent: ViewGroup?): View? {
        val newView = view ?: newView(inflater, position, parent)
        newView ?: throw IllegalStateException("newView result must not be null.")
        bindView(getItem(position), position, newView)
        return newView
    }

    abstract fun newView(inflater: LayoutInflater, position: Int, container: ViewGroup?): View?

    abstract fun bindView(item: T, position: Int, view: View)
}

エルビス演算子使えばいいのかなー?とかなんとなくKotlinっぽく書く努力をした結果がこれ。

ちゃんとSmart Castも使ってるよ?やるでしょ?

Java版はこんな感じ。

public abstract class BindableAdapter<T> extends ArrayAdapter<T> {
    private LayoutInflater mInflater;

    public BindableAdapter(Context context, List<T> episodeList) {
        super(context, -1, episodeList);
        setup(context);
    }

    private void setup(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public final View getView(int position, View view, ViewGroup container) {
        if (view == null) {
            view = newView(mInflater, position, container);
            if (view == null) {
                throw new IllegalStateException("newView result must not be null.");
            }
        }
        bindView(getItem(position), position, view);
        return view;
    }

    public abstract View newView(LayoutInflater inflater, int position, ViewGroup container);

    public abstract void bindView(T item, int position, View view);
}

まとめ

実際にコード書き始めるとめっちゃJavaっぽく書いてしまって...あとセミコロンな!