package in.srain.cube.views.block; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; public class BlockListView extends RelativeLayout { public interface OnItemClickListener { void onItemClick(View v, int position); } private static final int INDEX_TAG = 0x04 << 24; private BlockListAdapter<?> mBlockListAdapter; private LayoutInflater mLayoutInflater; private OnItemClickListener mOnItemClickListener; public BlockListView(Context context) { this(context, null, 0); } public BlockListView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BlockListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mLayoutInflater = LayoutInflater.from(context); } public void setAdapter(BlockListAdapter<?> adapter) { if (adapter == null) { throw new IllegalArgumentException("adapter should not be null"); } mBlockListAdapter = adapter; adapter.registerView(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (null != mBlockListAdapter) { mBlockListAdapter.registerView(null); } } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (null != mBlockListAdapter) { mBlockListAdapter.registerView(this); } } public void setOnItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; } OnClickListener mOnClickListener = new OnClickListener() { @Override public void onClick(View v) { int index = (Integer) v.getTag(INDEX_TAG); if (null != mOnItemClickListener) { mOnItemClickListener.onItemClick(v, index); } } }; @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void onDataListChange() { removeAllViews(); int len = mBlockListAdapter.getCount(); int w = mBlockListAdapter.getBlockWidth(); int h = mBlockListAdapter.getBlockHeight(); int columnNum = mBlockListAdapter.getCloumnNum(); int horizontalSpacing = mBlockListAdapter.getHorizontalSpacing(); int verticalSpacing = mBlockListAdapter.getVerticalSpacing(); boolean blockDescendant = getDescendantFocusability() == ViewGroup.FOCUS_BLOCK_DESCENDANTS; for (int i = 0; i < len; i++) { RelativeLayout.LayoutParams lyp = new RelativeLayout.LayoutParams(w, h); int row = i / columnNum; int clo = i % columnNum; int left = 0; int top = 0; if (clo > 0) { left = (horizontalSpacing + w) * clo; } if (row > 0) { top = (verticalSpacing + h) * row; } lyp.setMargins(left, top, 0, 0); View view = mBlockListAdapter.getView(mLayoutInflater, i); if (!blockDescendant) { view.setOnClickListener(mOnClickListener); } view.setTag(INDEX_TAG, i); addView(view, lyp); } requestLayout(); } }