Update itemDecorations for LayoutManager set by the application
Bug: 157515540
Test: Manual
Change-Id: I8886e3adf3a45eb2bbcd1dbea655a54b87a55a22
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
index cce2dd9..9e0cac8 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
@@ -82,7 +82,13 @@
private ScrollBar mScrollBar;
@Nullable
- private GridOffsetItemDecoration mOffsetItemDecoration;
+ private GridOffsetItemDecoration mTopOffsetItemDecorationGrid;
+ @Nullable
+ private GridOffsetItemDecoration mBottomOffsetItemDecorationGrid;
+ @Nullable
+ private RecyclerView.ItemDecoration mTopOffsetItemDecorationLinear;
+ @Nullable
+ private RecyclerView.ItemDecoration mBottomOffsetItemDecorationLinear;
@NonNull
private GridDividerItemDecoration mDividerItemDecorationGrid;
@NonNull
@@ -97,6 +103,10 @@
@Nullable
private LinearLayout mContainer;
+ private boolean mEnableDividers;
+ private int mTopOffset;
+ private int mBottomOffset;
+
/**
* The possible values for setScrollBarPosition. The default value is actually {@link
@@ -182,7 +192,7 @@
@CarUiRecyclerViewLayout int carUiRecyclerViewLayout =
a.getInt(R.styleable.CarUiRecyclerView_layoutStyle, CarUiRecyclerViewLayout.LINEAR);
mNumOfColumns = a.getInt(R.styleable.CarUiRecyclerView_numOfColumns, /* defValue= */ 2);
- boolean enableDivider =
+ mEnableDividers =
a.getBoolean(R.styleable.CarUiRecyclerView_enableDivider, /* defValue= */ false);
mDividerItemDecorationLinear = new LinearDividerItemDecoration(
@@ -194,41 +204,23 @@
context.getDrawable(R.drawable.car_ui_divider),
mNumOfColumns);
- int topOffset = a.getInteger(R.styleable.CarUiRecyclerView_topOffset, /* defValue= */0);
- int bottomOffset = a.getInteger(
+ mTopOffset = a.getInteger(R.styleable.CarUiRecyclerView_topOffset, /* defValue= */0);
+ mBottomOffset = a.getInteger(
R.styleable.CarUiRecyclerView_bottomOffset, /* defValue= */0);
+ mTopOffsetItemDecorationLinear =
+ new LinearOffsetItemDecoration(mTopOffset, OffsetPosition.START);
+ mBottomOffsetItemDecorationLinear =
+ new LinearOffsetItemDecoration(mBottomOffset, OffsetPosition.END);
+ mTopOffsetItemDecorationGrid =
+ new GridOffsetItemDecoration(mTopOffset, mNumOfColumns,
+ OffsetPosition.START);
+ mBottomOffsetItemDecorationGrid =
+ new GridOffsetItemDecoration(mBottomOffset, mNumOfColumns,
+ OffsetPosition.END);
if (carUiRecyclerViewLayout == CarUiRecyclerViewLayout.LINEAR) {
-
- if (enableDivider) {
- addItemDecoration(mDividerItemDecorationLinear);
- }
- RecyclerView.ItemDecoration topOffsetItemDecoration =
- new LinearOffsetItemDecoration(topOffset, OffsetPosition.START);
-
- RecyclerView.ItemDecoration bottomOffsetItemDecoration =
- new LinearOffsetItemDecoration(bottomOffset, OffsetPosition.END);
-
- addItemDecoration(topOffsetItemDecoration);
- addItemDecoration(bottomOffsetItemDecoration);
setLayoutManager(new LinearLayoutManager(getContext()));
} else {
-
- if (enableDivider) {
- addItemDecoration(mDividerItemDecorationGrid);
- }
-
- mOffsetItemDecoration =
- new GridOffsetItemDecoration(topOffset, mNumOfColumns,
- OffsetPosition.START);
-
- GridOffsetItemDecoration bottomOffsetItemDecoration =
- new GridOffsetItemDecoration(bottomOffset, mNumOfColumns,
- OffsetPosition.END);
-
- addItemDecoration(mOffsetItemDecoration);
- addItemDecoration(bottomOffsetItemDecoration);
setLayoutManager(new GridLayoutManager(getContext(), mNumOfColumns));
- setNumOfColumns(mNumOfColumns);
}
a.recycle();
@@ -255,6 +247,34 @@
mScrollBarClass = context.getResources().getString(R.string.car_ui_scrollbar_component);
}
+ @Override
+ public void setLayoutManager(@Nullable LayoutManager layout) {
+ addItemDecorations(layout);
+ super.setLayoutManager(layout);
+ }
+
+ private void addItemDecorations(LayoutManager layout) {
+ if (layout instanceof GridLayoutManager) {
+ if (mEnableDividers) {
+ removeItemDecoration(mDividerItemDecorationGrid);
+ addItemDecoration(mDividerItemDecorationGrid);
+ }
+ removeItemDecoration(mTopOffsetItemDecorationGrid);
+ addItemDecoration(mTopOffsetItemDecorationGrid);
+ removeItemDecoration(mBottomOffsetItemDecorationGrid);
+ addItemDecoration(mBottomOffsetItemDecorationGrid);
+ setNumOfColumns(((GridLayoutManager) layout).getSpanCount());
+ } else {
+ if (mEnableDividers) {
+ addItemDecoration(mDividerItemDecorationLinear);
+ }
+ removeItemDecoration(mTopOffsetItemDecorationLinear);
+ addItemDecoration(mTopOffsetItemDecorationLinear);
+ removeItemDecoration(mBottomOffsetItemDecorationLinear);
+ addItemDecoration(mBottomOffsetItemDecorationLinear);
+ }
+ }
+
/**
* If this view's content description isn't set to opt out of scrolling via the rotary
* controller, initialize it accordingly.
@@ -324,8 +344,8 @@
*/
public void setNumOfColumns(int numberOfColumns) {
mNumOfColumns = numberOfColumns;
- if (mOffsetItemDecoration != null) {
- mOffsetItemDecoration.setNumOfColumns(mNumOfColumns);
+ if (mTopOffsetItemDecorationGrid != null) {
+ mTopOffsetItemDecorationGrid.setNumOfColumns(mNumOfColumns);
}
if (mDividerItemDecorationGrid != null) {
mDividerItemDecorationGrid.setNumOfColumns(mNumOfColumns);
diff --git a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
index 5d51d4c..a691bf0 100644
--- a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
+++ b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
@@ -20,6 +20,7 @@
import android.os.Bundle;
import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
import com.android.car.ui.baselayout.Insets;
import com.android.car.ui.baselayout.InsetsChangedListener;
@@ -47,6 +48,7 @@
toolbar.setState(Toolbar.State.SUBPAGE);
CarUiRecyclerView recyclerView = findViewById(R.id.list);
+ recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
RecyclerViewAdapter adapter = new RecyclerViewAdapter(generateSampleData());
recyclerView.setAdapter(adapter);
diff --git a/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml b/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
index 2b0d1a4..622ffa3 100644
--- a/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
+++ b/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
@@ -18,7 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/list"
- app:layoutStyle="grid"
app:numOfColumns="4"
android:layout_width="match_parent"
android:layout_height="match_parent"