diff --git a/car/api/current.txt b/car/api/current.txt
index 1396dc5..2128c7b 100644
--- a/car/api/current.txt
+++ b/car/api/current.txt
@@ -378,7 +378,6 @@
   }
 
   public class SeekbarListItem extends androidx.car.widget.ListItem {
-    ctor public deprecated SeekbarListItem(android.content.Context, int, int, android.widget.SeekBar.OnSeekBarChangeListener, java.lang.String);
     ctor public SeekbarListItem(android.content.Context);
     method public static androidx.car.widget.SeekbarListItem.ViewHolder createViewHolder(android.view.View);
     method public int getViewType();
@@ -389,13 +388,14 @@
     method public void setPrimaryActionEmptyIcon();
     method public void setPrimaryActionIcon(int);
     method public void setPrimaryActionIcon(android.graphics.drawable.Drawable);
+    method public void setPrimaryActionIconListener(android.view.View.OnClickListener);
     method public void setProgress(int);
     method public void setSecondaryProgress(int);
     method public void setSupplementalEmptyIcon(boolean);
     method public void setSupplementalIcon(int, boolean);
-    method public void setSupplementalIcon(int, boolean, android.view.View.OnClickListener);
     method public void setSupplementalIcon(android.graphics.drawable.Drawable, boolean);
-    method public void setSupplementalIcon(android.graphics.drawable.Drawable, boolean, android.view.View.OnClickListener);
+    method public deprecated void setSupplementalIcon(android.graphics.drawable.Drawable, boolean, android.view.View.OnClickListener);
+    method public void setSupplementalIconListener(android.view.View.OnClickListener);
     method public void setText(java.lang.String);
   }
 
diff --git a/car/src/androidTest/java/androidx/car/widget/SeekbarListItemTest.java b/car/src/androidTest/java/androidx/car/widget/SeekbarListItemTest.java
index 5233734..82f5268 100644
--- a/car/src/androidTest/java/androidx/car/widget/SeekbarListItemTest.java
+++ b/car/src/androidTest/java/androidx/car/widget/SeekbarListItemTest.java
@@ -74,9 +74,18 @@
         mPagedListView = mActivity.findViewById(R.id.paged_list_view);
     }
 
+    private SeekbarListItem initSeekbarListItem() {
+        SeekbarListItem item = new SeekbarListItem(mActivity);
+        item.setMax(0);
+        item.setProgress(0);
+        item.setOnSeekBarChangeListener(null);
+        item.setText(null);
+        return item;
+    }
+
     @Test
     public void testOnlySliderIsVisibleInEmptyItem() {
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item = initSeekbarListItem();
 
         setupPagedListView(Arrays.asList(item));
         verifyViewDefaultVisibility(mPagedListView.getRecyclerView().getLayoutManager()
@@ -85,14 +94,13 @@
 
     @Test
     public void testPrimaryActionVisible() {
-        SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item0 = initSeekbarListItem();
         item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
 
-        SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item1 = initSeekbarListItem();
         item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
 
-        List<ListItem> items = Arrays.asList(item0, item1);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item0, item1));
 
         assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
                 is(equalTo(View.VISIBLE)));
@@ -102,21 +110,20 @@
 
     @Test
     public void testSliderTextVisible() {
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, "Text");
+        SeekbarListItem item = initSeekbarListItem();
+        item.setText("Text");
 
-        List<ListItem> items = Arrays.asList(item);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item));
 
         assertThat(getViewHolderAtPosition(0).getText().getVisibility(), is(equalTo(View.VISIBLE)));
     }
 
     @Test
     public void testSupplementalIconVisible() {
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item = initSeekbarListItem();
         item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
 
-        List<ListItem> items = Arrays.asList(item);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item));
 
         assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getVisibility(),
                 is(equalTo(View.VISIBLE)));
@@ -126,11 +133,10 @@
 
     @Test
     public void testSupplementalIconDividerVisible() {
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item = initSeekbarListItem();
         item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
 
-        List<ListItem> items = Arrays.asList(item);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item));
 
         assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getVisibility(),
                 is(equalTo(View.VISIBLE)));
@@ -215,27 +221,41 @@
     }
 
     @Test
-    public void testPrimaryIconIsNotClickable() {
-        SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
+    public void testPrimaryIconIsNotClickableWithoutListener() {
+        SeekbarListItem item0 = initSeekbarListItem();
         item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
 
-        SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item1 = initSeekbarListItem();
         item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
 
-        List<ListItem> items = Arrays.asList(item0, item1);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item0, item1));
 
         assertFalse(getViewHolderAtPosition(0).getPrimaryIcon().isClickable());
         assertFalse(getViewHolderAtPosition(1).getPrimaryIcon().isClickable());
     }
 
     @Test
+    public void testClickingPrimaryActionIcon() {
+        boolean[] clicked = {false};
+        SeekbarListItem item = initSeekbarListItem();
+        item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
+        item.setPrimaryActionIconListener(v -> clicked[0] = true);
+
+        setupPagedListView(Arrays.asList(item));
+
+        onView(withId(R.id.recycler_view)).perform(
+                actionOnItemAtPosition(0, clickChildViewWithId(R.id.primary_icon)));
+
+        assertTrue(clicked[0]);
+        assertTrue(getViewHolderAtPosition(0).getPrimaryIcon().isClickable());
+    }
+
+    @Test
     public void testSupplementalIconNotClickableWithoutListener() {
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item = initSeekbarListItem();
         item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
 
-        List<ListItem> items = Arrays.asList(item);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item));
 
         assertFalse(getViewHolderAtPosition(0).getSupplementalIcon().isClickable());
     }
@@ -243,12 +263,11 @@
     @Test
     public void testClickingSupplementalIcon() {
         boolean[] clicked = {false};
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
-        item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false,
-                v -> clicked[0] = true);
+        SeekbarListItem item = initSeekbarListItem();
+        item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
+        item.setSupplementalIconListener(v -> clicked[0] = true);
 
-        List<ListItem> items = Arrays.asList(item);
-        setupPagedListView(items);
+        setupPagedListView(Arrays.asList(item));
 
         onView(withId(R.id.recycler_view)).perform(
                 actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
@@ -258,13 +277,13 @@
 
     @Test
     public void testPrimaryActionEmptyIconSpacing() {
-        SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item0 = initSeekbarListItem();
         item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
 
-        SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item1 = initSeekbarListItem();
         item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
 
-        SeekbarListItem item2 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item2 = initSeekbarListItem();
         item2.setPrimaryActionEmptyIcon();
 
         List<ListItem> items = Arrays.asList(item0, item1, item2);
@@ -279,10 +298,10 @@
     @Test
     public void testSupplementalIconSpacingWithoutDivider() {
         final boolean showDivider = false;
-        SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item0 = initSeekbarListItem();
         item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, showDivider);
 
-        SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item1 = initSeekbarListItem();
         item1.setSupplementalEmptyIcon(showDivider);
 
         List<ListItem> items = Arrays.asList(item0, item1);
@@ -297,10 +316,10 @@
     @Test
     public void testSupplementalIconSpacingWithDivider() {
         final boolean showDivider = true;
-        SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item0 = initSeekbarListItem();
         item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, showDivider);
 
-        SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item1 = initSeekbarListItem();
         item1.setSupplementalEmptyIcon(showDivider);
 
         List<ListItem> items = Arrays.asList(item0, item1);
@@ -315,7 +334,7 @@
     @Test
     public void testSettingSupplementalIconWithDrawable() {
         Drawable drawable = mActivity.getDrawable(android.R.drawable.sym_def_app_icon);
-        SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
+        SeekbarListItem item = initSeekbarListItem();
         item.setSupplementalIcon(drawable, false);
 
         setupPagedListView(Arrays.asList(item));
diff --git a/car/src/main/java/androidx/car/widget/SeekbarListItem.java b/car/src/main/java/androidx/car/widget/SeekbarListItem.java
index b175334..d859b63 100644
--- a/car/src/main/java/androidx/car/widget/SeekbarListItem.java
+++ b/car/src/main/java/androidx/car/widget/SeekbarListItem.java
@@ -98,6 +98,7 @@
 
     @PrimaryActionType private int mPrimaryActionType = PRIMARY_ACTION_TYPE_NO_ICON;
     private Drawable mPrimaryActionIconDrawable;
+    private View.OnClickListener mPrimaryActionIconOnClickListener;
 
     private String mText;
 
@@ -118,28 +119,6 @@
         return new ViewHolder(itemView);
     }
 
-    /**
-     * Creates a SeekbarListItem.
-     *
-     * @param context context
-     * @param max the upper range of the SeekBar.
-     * @param progress the current progress of the specified value.
-     * @param listener listener to receive notification of changes to progress level.
-     * @param text displays a text on top of the SeekBar.
-     *
-     * @deprecated use {@link #SeekbarListItem(Context)} and individual field setters instead.
-     */
-    @Deprecated
-    public SeekbarListItem(Context context, int max, int progress,
-            SeekBar.OnSeekBarChangeListener listener, String text) {
-        this(context);
-
-        setMax(max);
-        setProgress(progress);
-        setOnSeekBarChangeListener(listener);
-        setText(text);
-    }
-
     public SeekbarListItem(Context context) {
         mContext = context;
         markDirty();
@@ -310,6 +289,10 @@
                 mBinders.add(vh -> {
                     vh.getPrimaryIcon().setVisibility(View.VISIBLE);
                     vh.getPrimaryIcon().setImageDrawable(mPrimaryActionIconDrawable);
+                    vh.getPrimaryIcon().setOnClickListener(
+                            mPrimaryActionIconOnClickListener);
+                    vh.getPrimaryIcon().setClickable(
+                            mPrimaryActionIconOnClickListener != null);
                 });
                 break;
             default:
@@ -494,6 +477,16 @@
     }
 
     /**
+     * Sets an {@code OnClickListener} for the icon representing the {@code Primary Action}.
+     *
+     * @param onClickListener the listener to be set for the primary action icon.
+     */
+    public void setPrimaryActionIconListener(View.OnClickListener onClickListener) {
+        mPrimaryActionIconOnClickListener = onClickListener;
+        markDirty();
+    }
+
+    /**
      * Sets {@code Primary Action} to be empty icon.
      *
      * {@code Seekbar} would have a start margin as if {@code Primary Action} were set as icon.
@@ -508,30 +501,45 @@
      * Sets {@code Supplemental Action} to be represented by an {@code Supplemental Icon}.
      */
     public void setSupplementalIcon(@DrawableRes int iconResId,
-                                    boolean showSupplementalIconDivider) {
-        setSupplementalIcon(mContext.getDrawable(iconResId), showSupplementalIconDivider, null);
-    }
-
-    /**
-     * Sets {@code Supplemental Action} to be represented by an {@code Supplemental Icon}.
-     */
-    public void setSupplementalIcon(@DrawableRes int iconResId, boolean showSupplementalIconDivider,
-                                    @Nullable View.OnClickListener listener) {
-        setSupplementalIcon(mContext.getDrawable(iconResId), showSupplementalIconDivider, listener);
+            boolean showSupplementalIconDivider) {
+        setSupplementalIconInfo(mContext.getDrawable(iconResId), showSupplementalIconDivider);
     }
 
     /**
      * Sets {@code Supplemental Action} to be represented by an {@code Supplemental Icon}.
      */
     public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider) {
-        setSupplementalIcon(drawable, showSupplementalIconDivider, null);
+        setSupplementalIconInfo(drawable, showSupplementalIconDivider);
+    }
+
+    /**
+     * Sets {@code OnClickListener} for a {@code Supplemental Icon}.
+     */
+    public void setSupplementalIconListener(View.OnClickListener listener) {
+        mSupplementalIconOnClickListener = listener;
+
+        markDirty();
+    }
+
+    private void setSupplementalIconInfo(Drawable drawable, boolean showSupplementalIconDivider) {
+        mSupplementalActionType = SUPPLEMENTAL_ACTION_SUPPLEMENTAL_ICON;
+
+        mSupplementalIconDrawable = drawable;
+        mShowSupplementalIconDivider = showSupplementalIconDivider;
+
+        markDirty();
     }
 
     /**
      * Sets {@code Supplemental Action} to be represented by an {@code Supplemental Icon}.
+     *
+     * @deprecated use either {@link #setSupplementalIcon(Drawable, boolean)} or
+     * {@link #setSupplementalIcon(int, boolean)} and
+     * {@link #setSupplementalIconListener(android.view.View.OnClickListener)}.
      */
+    @Deprecated
     public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider,
-                                    @Nullable  View.OnClickListener listener) {
+            @Nullable  View.OnClickListener listener) {
         mSupplementalActionType = SUPPLEMENTAL_ACTION_SUPPLEMENTAL_ICON;
 
         mSupplementalIconDrawable = drawable;
diff --git a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SeekbarListItemActivity.java b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SeekbarListItemActivity.java
index daa8178..3041264 100644
--- a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SeekbarListItemActivity.java
+++ b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SeekbarListItemActivity.java
@@ -88,13 +88,16 @@
             subheaderItem = new SubheaderListItem(mContext, "Slider Only");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             mItems.add(item);
 
 
@@ -102,55 +105,73 @@
             subheaderItem = new SubheaderListItem(mContext, "With Primary Action");
             mItems.add(subheaderItem);
             // Only slider. No text.
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
             mItems.add(item);
 
             // One line text.
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
             mItems.add(item);
 
             // Long text.
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
             mItems.add(item);
 
+            // Clickable PrimaryActionIcon.
+            item = initSeekbarListItem();
+            item.setText("with clickable Primary icon");
+            item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
+            item.setPrimaryActionIconListener(v -> Toast.makeText(mContext,
+                    "Primary icon clicked!", Toast.LENGTH_SHORT).show());
+            mItems.add(item);
+
             // End icon with divider.
             subheaderItem = new SubheaderListItem(mContext, "With Supplemental Action");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "with clickable icon");
-            item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true,
-                    v -> Toast.makeText(mContext, "Supplemental icon clicked!", Toast.LENGTH_SHORT)
-                            .show());
+            item = initSeekbarListItem();
+            item.setText("with clickable icon");
+            item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
+            item.setSupplementalIconListener(v -> Toast.makeText(mContext,
+                    "Supplemental icon clicked!", Toast.LENGTH_SHORT).show());
             mItems.add(item);
 
             // Empty end icon with divider.
             subheaderItem = new SubheaderListItem(mContext, "With Empty Icon");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             item.setSupplementalEmptyIcon(true);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             item.setSupplementalEmptyIcon(true);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             item.setSupplementalEmptyIcon(true);
             mItems.add(item);
 
@@ -158,15 +179,18 @@
             subheaderItem = new SubheaderListItem(mContext, "Without Supplemental Action Divider");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
             mItems.add(item);
 
@@ -174,15 +198,18 @@
             subheaderItem = new SubheaderListItem(mContext, "With Empty Icon No Divider");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, null);
+            item = initSeekbarListItem();
+            item.setText(null);
             item.setSupplementalEmptyIcon(false);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, "one line text");
+            item = initSeekbarListItem();
+            item.setText("one line text");
             item.setSupplementalEmptyIcon(false);
             mItems.add(item);
 
-            item = new SeekbarListItem(mContext, 100, 0, mListener, longText);
+            item = initSeekbarListItem();
+            item.setText(longText);
             item.setSupplementalEmptyIcon(false);
             mItems.add(item);
 
@@ -190,7 +217,10 @@
             subheaderItem = new SubheaderListItem(mContext, "Secondary Progress");
             mItems.add(subheaderItem);
 
-            item = new SeekbarListItem(mContext, 100, 0, new SeekBar.OnSeekBarChangeListener() {
+            item = new SeekbarListItem(mContext);
+            item.setMax(100);
+            item.setProgress(0);
+            item.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                 @Override
                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                     seekBar.setSecondaryProgress(progress + 10);
@@ -203,12 +233,20 @@
                 @Override
                 public void onStopTrackingTouch(SeekBar seekBar) {
                 }
-            }, null);
+            });
             mItems.add(item);
 
             mListProvider = new ListItemProvider.ListProvider(mItems);
         }
 
+        private SeekbarListItem initSeekbarListItem() {
+            SeekbarListItem item = new SeekbarListItem(mContext);
+            item.setMax(100);
+            item.setProgress(0);
+            item.setOnSeekBarChangeListener(mListener);
+            return item;
+        }
+
         @Override
         public ListItem get(int position) {
             return mListProvider.get(position);
