うさがにっき

読書感想文とプログラムのこと書いてきます

RecyclerView内で正方形のViewを定義する方法

概要

RecyclerViewの要素で画面の横幅にあわせた子要素を定義する方法をまとめた

まとめ

結論から言うとRecyclerView.Adapterから攻めるより正方形の独自Viewを作る方が現実的

最初はRecyclerView.Adapter内のonBindViewHolderで横幅を取得し、縦に設定しようとしたが、やはりonBindViewHolder時点では横幅は決定しておらず0しかとれなかった

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // width = 0
        int width = holder.image.getWidth();

onWindowFocusChangedのようなメソッドも見つからないし、どうしたものかと考えていたら、「横幅だけとってそこから正方形のView作っちゃってそれ使えばいいんじゃね?」というstackoverflowに記事があったので試してみた
android - Get width of CardView in Adapter.onBindViewHolder - Stack Overflow

public class MyCustomImageView extends ImageView {
    public MyCustomImageView(Context context) {
        super(context);
    }

    public MyCustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyCustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // 縦横サイズ一緒に
        int width = getMeasuredWidth();
        setMeasuredDimension(width, width);
    }
}

viewHolderのlayoutに独自Viewを指定し、実行

f:id:tiro105:20151205222024p:plain
無事正方形の画像が表示された

わかってみれば簡単だが、気づくまで時間がかかった・・・的なメモ記事