This page describes the process of customizingCarUiRecyclerView and the scroll
bar.
Prerequisites
This page presumes knowledge of a runtime resource overlay (RRO) target APK. To learn more, see Customize apps.
About CarUiRecyclerView
When car_ui_scrollbar_enable is set to false in bools.xml,
CarUiRecyclerView doesn't inflate the scrollbar. That said, only the
androidx.recyclerview is inflated with customizable styles as defined below.
When car_ui_scrollbar_enable is set to true,
CarUiRecyclerView inflates the container with the scrollbar installed
within it. Later androidx.recyclerview is also added within the same
container.
CarUiRecyclerView can take any adapter to display the data. But the
recommendation is to use CarUiListItemAdapter where the chassis lib defines the
layout for listItems and hence can be customized by OEMs. The customization for ListItems
are defined in Customization
options for CarUiListItem.
By default, car_ui_scrollbar_margin is used as the width of the scrollbar view.
This margin is also added as android:endMargin of the CarUiRecyclerView so
there is equal margin at the start and end of the data. If the developer had used
enableDivider=true then the OEM can control how the dividers should appear.
Dimensions that can be adjusted for CarUiRecyclerView are:
<dimen name="car_ui_recyclerview_divider_height">0dp</dimen> <dimen name="car_ui_recyclerview_divider_start_margin">0dp</dimen> <dimen name="car_ui_recyclerview_divider_end_margin">0dp</dimen> <dimen name="car_ui_recyclerview_divider_top_margin">0dp</dimen> <dimen name="car_ui_recyclerview_divider_bottom_margin">0dp</dimen>
Scrollbar
The layout file for CarUiRV scrollbar is defined in
car_ui_recyclerview_scrollbar.xml. In total, these four views are
defined within the view:
| Views | |
|---|---|
Car_ui_scrollbar_page_up |
Defines the up button of the scrollbar. |
Car_ui_scrollbar_page_down |
defines the down button of the scrollbar. |
Car_ui_scrollbar_thumb |
Height is calculated dynamically depending on the number of list items in the Recycler View (RV). |
Car_ui_scrollbar_track |
Total height that defines the bounds in which the thumb will move. |
OEMs should overlay this layout file to customize the scrollbar. Track view should be placed carefully as that would define the bounds in which the thumb will move. Thumb height is calculated dynamically based on the list items in the RV and the height of the viewholders.
This layout is included in the CarUiRV container
car_ui_recycler_view.xml only if car_ui_scrollbar_enable
is true.
Other dimensions that can be adjusted for scrollbar are:
<dimen name="car_ui_scrollbar_container_width">@dimen/car_ui_margin</dimen> <dimen name="car_ui_scrollbar_button_size">@dimen/car_ui_touch_target_width</dimen> <dimen name="car_ui_scrollbar_thumb_width">7dp</dimen> <dimen name="car_ui_scrollbar_separator_margin">16dp</dimen> <dimen name="car_ui_scrollbar_margin">@dimen/car_ui_margin</dimen> <dimen name="car_ui_scrollbar_thumb_radius">100dp</dimen> <item name="car_ui_button_disabled_alpha" format="float" type="dimen">0.2</item> <item name="car_ui_scrollbar_milliseconds_per_inch" format="float" type="dimen">150.0</item> <item name="car_ui_scrollbar_deceleration_times_divisor" format="float" type="dimen">0.45</item> <item name="car_ui_scrollbar_decelerate_interpolator_factor" format="float" type="dimen">1.8</item> <dimen name="car_ui_scrollbar_padding_start">0dp</dimen> <dimen name="car_ui_scrollbar_padding_end">0dp</dimen>
Example
For example, to bring both the Up and Down arrow together at the bottom of the screen:
- Overlay
car_ui_recyclerview_scrollbar.xml:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/car_ui_margin" android:layout_height="match_parent" android:id="@+id/car_ui_scroll_bar"> <!-- View height is dynamically calculated during layout. --> <View android:id="@+id/car_ui_scrollbar_thumb" android:layout_width="7dp" android:layout_height="20dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="@drawable/car_ui_recyclerview_scrollbar_thumb"/> <View android:id="@+id/car_ui_scrollbar_track" android:layout_width="10dp" android:layout_height="match_parent" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:layout_above="@+id/car_ui_scrollbar_page_up"/> <ImageView android:id="@+id/car_ui_scrollbar_page_up" android:layout_width="76dp" android:layout_height="76dp" android:focusable="false" android:hapticFeedbackEnabled="false" android:src="@drawable/car_ui_recyclerview_ic_up" android:scaleType="centerInside" android:layout_centerHorizontal="true" android:layout_above="@+id/car_ui_scrollbar_page_down"/> <ImageView android:id="@+id/car_ui_scrollbar_page_down" android:layout_width="76dp" android:layout_height="76dp" android:focusable="false" android:hapticFeedbackEnabled="false" android:src="@drawable/car_ui_recyclerview_ic_down" android:scaleType="centerInside" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"/> </RelativeLayout>
- To define the resources to be overlaid by the RRO, add
Overlays.xml:<overlay> <item target="id/car_ui_scroll_bar" value="@id/car_ui_scroll_bar"/> <item target="id/car_ui_scrollbar_thumb" value="@id/car_ui_scrollbar_thumb"/> <item target="id/car_ui_scrollbar_track" value="@id/car_ui_scrollbar_track"/> <item target="id/car_ui_scrollbar_page_up" value="@id/car_ui_scrollbar_page_up"/> <item target="id/car_ui_scrollbar_page_down" value="@id/car_ui_scrollbar_page_down"/> <item target="layout/car_ui_recyclerview_scrollbar" value="@layout/car_ui_recyclerview_scrollbar"/> </overlay>
- If an Up, Down, or thumb drawable must be updated, they should also be overlaid.
- If any new resources are used in the RRO package that do not already exist, then these resources should also be defined in the RRO APK you create.