From 8e071edcb9543263eb34387c72a3960adb930fb7 Mon Sep 17 00:00:00 2001 From: aromanov Date: Wed, 22 Jul 2015 18:19:16 -0700 Subject: [PATCH] set a custom secondary dimension from elsewhere --- layouts/build.gradle | 2 +- .../twowayview/widget/BaseLayoutManager.java | 39 +++++++++++++++++-- .../org/lucasr/twowayview/widget/Lanes.java | 28 +++++++++++++ .../widget/SpannableGridLayoutManager.java | 4 +- .../twowayview/sample/LayoutFragment.java | 12 +++++- 5 files changed, 77 insertions(+), 8 deletions(-) diff --git a/layouts/build.gradle b/layouts/build.gradle index 5c74392..f412b91 100644 --- a/layouts/build.gradle +++ b/layouts/build.gradle @@ -17,7 +17,7 @@ android { dependencies { compile project(':core') - compile 'com.android.support:recyclerview-v7:21.0.0' + compile 'com.android.support:recyclerview-v7:22.1.0' } apply from: "${rootDir}/gradle/scripts/gradle-mvn-push.gradle" diff --git a/layouts/src/main/java/org/lucasr/twowayview/widget/BaseLayoutManager.java b/layouts/src/main/java/org/lucasr/twowayview/widget/BaseLayoutManager.java index 4193cc6..117bb97 100644 --- a/layouts/src/main/java/org/lucasr/twowayview/widget/BaseLayoutManager.java +++ b/layouts/src/main/java/org/lucasr/twowayview/widget/BaseLayoutManager.java @@ -134,6 +134,9 @@ private enum UpdateOp { private Lanes mLanes; private Lanes mLanesToRestore; + // external attributes + private int mCustomWidth; + private int mCustomHeight; private ItemEntries mItemEntries; private ItemEntries mItemEntriesToRestore; @@ -148,6 +151,8 @@ public BaseLayoutManager(Context context, AttributeSet attrs) { public BaseLayoutManager(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + // TODO setCustomWidth() + // TODO setCustomHeight() } public BaseLayoutManager(Orientation orientation) { @@ -259,6 +264,7 @@ private boolean canUseLanes(Lanes lanes) { return (lanes.getOrientation() == getOrientation() && lanes.getCount() == laneCount && + lanes.getSecondaryDimension() == getSecondaryDimension() && lanes.getLaneSize() == laneSize); } @@ -269,7 +275,7 @@ private boolean ensureLayoutState() { } final Lanes oldLanes = mLanes; - mLanes = new Lanes(this, laneCount); + mLanes = new Lanes(this, laneCount, getSecondaryDimension()); requestMoveLayout(); @@ -421,6 +427,7 @@ public Parcelable onSaveInstanceState() { state.orientation = getOrientation(); state.laneSize = (mLanes != null ? mLanes.getLaneSize() : 0); + state.secondaryDimension = (mLanes != null ? mLanes.getSecondaryDimension() : 0); state.itemEntries = mItemEntries; return state; @@ -431,7 +438,7 @@ public void onRestoreInstanceState(Parcelable state) { final LanedSavedState ss = (LanedSavedState) state; if (ss.lanes != null && ss.laneSize > 0) { - mLanesToRestore = new Lanes(this, ss.orientation, ss.lanes, ss.laneSize); + mLanesToRestore = new Lanes(this, ss.orientation, ss.lanes, ss.laneSize, ss.secondaryDimension); mItemEntriesToRestore = ss.itemEntries; } @@ -452,7 +459,7 @@ private int getWidthUsed(View child) { return 0; } - final int size = getLanes().getLaneSize() * getLaneSpanForChild(child); + final int size = getLanes().getLaneWidth() * getLaneSpanForChild(child); return getWidth() - getPaddingLeft() - getPaddingRight() - size; } @@ -461,7 +468,7 @@ private int getHeightUsed(View child) { return 0; } - final int size = getLanes().getLaneSize() * getLaneSpanForChild(child); + final int size = getLanes().getLaneHeight() * getLaneSpanForChild(child); return getHeight() - getPaddingTop() - getPaddingBottom() - size; } @@ -566,10 +573,32 @@ public LayoutParams generateLayoutParams(Context c, AttributeSet attrs) { abstract void getLaneForPosition(LaneInfo outInfo, int position, Direction direction); abstract void moveLayoutToPosition(int position, int offset, Recycler recycler, State state); + + public void setCustomWidth(int mCustomWidth) { + this.mCustomWidth = mCustomWidth; + } + + public void setCustomHeight(int mCustomHeight) { + this.mCustomHeight = mCustomHeight; + } + + + public int getSecondaryDimension() { + switch (getOrientation()){ + case HORIZONTAL: + return mCustomHeight; + case VERTICAL: + return mCustomWidth; + default: + return 0; // not use at all + } + } + protected static class LanedSavedState extends SavedState { private Orientation orientation; private Rect[] lanes; private int laneSize; + private int secondaryDimension; private ItemEntries itemEntries; protected LanedSavedState(Parcelable superState) { @@ -581,6 +610,7 @@ private LanedSavedState(Parcel in) { orientation = Orientation.values()[in.readInt()]; laneSize = in.readInt(); + secondaryDimension = in.readInt(); final int laneCount = in.readInt(); if (laneCount > 0) { @@ -608,6 +638,7 @@ public void writeToParcel(Parcel out, int flags) { out.writeInt(orientation.ordinal()); out.writeInt(laneSize); + out.writeInt(secondaryDimension); final int laneCount = (lanes != null ? lanes.length : 0); out.writeInt(laneCount); diff --git a/layouts/src/main/java/org/lucasr/twowayview/widget/Lanes.java b/layouts/src/main/java/org/lucasr/twowayview/widget/Lanes.java index 51db3c3..ae77c5f 100644 --- a/layouts/src/main/java/org/lucasr/twowayview/widget/Lanes.java +++ b/layouts/src/main/java/org/lucasr/twowayview/widget/Lanes.java @@ -36,6 +36,20 @@ class Lanes { private Integer mInnerStart; private Integer mInnerEnd; + private final int mSecondaryDimension; + + public int getLaneWidth() { + return mIsVertical || mSecondaryDimension == 0 ? mLaneSize : mSecondaryDimension; + } + + public int getLaneHeight() { + return !mIsVertical || mSecondaryDimension == 0 ? mLaneSize : mSecondaryDimension; + } + + public int getSecondaryDimension() { + return mSecondaryDimension; + } + public static class LaneInfo { public int startLane; public int anchorLane; @@ -56,10 +70,17 @@ public void setUndefined() { } public Lanes(BaseLayoutManager layout, Orientation orientation, Rect[] lanes, int laneSize) { + this(layout, orientation, lanes, laneSize, 0); + } + + public Lanes(BaseLayoutManager layout, Orientation orientation, Rect[] lanes, int laneSize, + int secondaryDimension + ) { mLayout = layout; mIsVertical = (orientation == Orientation.VERTICAL); mLanes = lanes; mLaneSize = laneSize; + mSecondaryDimension = secondaryDimension; mSavedLanes = new Rect[mLanes.length]; for (int i = 0; i < mLanes.length; i++) { @@ -68,6 +89,12 @@ public Lanes(BaseLayoutManager layout, Orientation orientation, Rect[] lanes, in } public Lanes(BaseLayoutManager layout, int laneCount) { + this(layout, laneCount, 0); + } + + public Lanes(BaseLayoutManager layout, int laneCount, + int secondaryDimension + ) { mLayout = layout; mIsVertical = layout.isVertical(); @@ -79,6 +106,7 @@ public Lanes(BaseLayoutManager layout, int laneCount) { } mLaneSize = calculateLaneSize(layout, laneCount); + mSecondaryDimension = secondaryDimension; final int paddingLeft = layout.getPaddingLeft(); final int paddingTop = layout.getPaddingTop(); diff --git a/layouts/src/main/java/org/lucasr/twowayview/widget/SpannableGridLayoutManager.java b/layouts/src/main/java/org/lucasr/twowayview/widget/SpannableGridLayoutManager.java index 446e4af..55478ff 100644 --- a/layouts/src/main/java/org/lucasr/twowayview/widget/SpannableGridLayoutManager.java +++ b/layouts/src/main/java/org/lucasr/twowayview/widget/SpannableGridLayoutManager.java @@ -92,11 +92,11 @@ public SpannableGridLayoutManager(Orientation orientation, int numColumns, int n } private int getChildWidth(int colSpan) { - return getLanes().getLaneSize() * colSpan; + return getLanes().getLaneWidth() * colSpan; } private int getChildHeight(int rowSpan) { - return getLanes().getLaneSize() * rowSpan; + return getLanes().getLaneHeight() * rowSpan; } private static int getLaneSpan(LayoutParams lp, boolean isVertical) { diff --git a/sample/src/main/java/org/lucasr/twowayview/sample/LayoutFragment.java b/sample/src/main/java/org/lucasr/twowayview/sample/LayoutFragment.java index ef14288..0c84676 100644 --- a/sample/src/main/java/org/lucasr/twowayview/sample/LayoutFragment.java +++ b/sample/src/main/java/org/lucasr/twowayview/sample/LayoutFragment.java @@ -17,6 +17,7 @@ package org.lucasr.twowayview.sample; import android.app.Activity; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -35,6 +36,7 @@ import org.lucasr.twowayview.ItemClickSupport; import org.lucasr.twowayview.ItemClickSupport.OnItemClickListener; import org.lucasr.twowayview.ItemClickSupport.OnItemLongClickListener; +import org.lucasr.twowayview.widget.BaseLayoutManager; import org.lucasr.twowayview.widget.DividerItemDecoration; import org.lucasr.twowayview.widget.TwoWayView; @@ -84,6 +86,14 @@ public void onViewCreated(View view, Bundle savedInstanceState) { mRecyclerView.setHasFixedSize(true); mRecyclerView.setLongClickable(true); + RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager(); + Resources res = getResources(); + if (layoutManager instanceof BaseLayoutManager) { + BaseLayoutManager manager = (BaseLayoutManager) layoutManager; + manager.setCustomWidth((int) res.getDimension(R.dimen.abc_text_size_display_2_material)); + manager.setCustomHeight((int) res.getDimension(R.dimen.abc_text_size_display_1_material)); + }; + mPositionText = (TextView) view.getRootView().findViewById(R.id.position); mCountText = (TextView) view.getRootView().findViewById(R.id.count); @@ -122,7 +132,7 @@ public void onScrolled(RecyclerView recyclerView, int i, int i2) { } }); - final Drawable divider = getResources().getDrawable(R.drawable.divider); + final Drawable divider = res.getDrawable(R.drawable.divider); mRecyclerView.addItemDecoration(new DividerItemDecoration(divider)); mRecyclerView.setAdapter(new LayoutAdapter(activity, mRecyclerView, mLayoutId));