package com.koushikdutta.boilerplate.recyclerview; import android.content.Context; import android.content.res.TypedArray; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.View; import android.widget.GridView; import com.koushikdutta.boilerplate.R; import java.util.Hashtable; /** * Created by koush on 4/19/15. */ public class GridRecyclerView extends HeaderRecyclerView { Hashtable<Integer, Integer> typeToSpan; GridLayoutManager gridLayoutManager; GridLayoutManager.SpanSizeLookup spanSizeLookup; public GridRecyclerView(Context context) { super(context); } public GridRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public GridRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override void init(Context context, AttributeSet attrs, int defStyleAttr) { super.init(context, attrs, defStyleAttr); final TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.GridRecyclerView, defStyleAttr, 0); int numColumns = a.getInt(R.styleable.GridRecyclerView_numColumns, 1); setNumColumns(context, numColumns); } public void setNumColumns(int numColumns) { setNumColumns(getContext(), numColumns); } private void setNumColumns(Context context, int numColumns) { if (gridLayoutManager == null) { gridLayoutManager = new GridLayoutManager(context, numColumns); typeToSpan = new Hashtable<Integer, Integer>(); gridLayoutManager.setSpanSizeLookup(spanSizeLookup = new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int viewType = getAdapter().getItemViewType(position); Integer span = typeToSpan.get(viewType); if (span != null) return span; ViewHolder vh = getAdapter().createViewHolder(GridRecyclerView.this, viewType); int foundSpan; if (vh instanceof SpanningViewHolder) foundSpan = ((SpanningViewHolder)vh).getSpanSize(gridLayoutManager.getSpanCount()); else foundSpan = 1; typeToSpan.put(viewType, foundSpan); return foundSpan; } }); setLayoutManager(gridLayoutManager); } else { gridLayoutManager.setSpanCount(numColumns); } typeToSpan.clear(); spanSizeLookup.invalidateSpanIndexCache(); requestLayout(); } public interface SpanningViewHolder { int getSpanSize(int spanCount); } }