diff --git a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
index a9008cb..f472edf 100644
--- a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
+++ b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
@@ -33,6 +33,7 @@
 import android.os.Handler;
 import android.provider.Settings;
 import android.text.SpannableString;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.style.ForegroundColorSpan;
 import android.util.SparseArray;
@@ -580,27 +581,34 @@
             update(1500, mListSummaries, 1, "12 miles | 12 min | $9.00", sliceUri, r);
             update(1700, mListSummaries, 2, "5 miles | 10 min | $8.00", sliceUri, r);
         }
-        Slice s = new ListBuilder(getContext(), sliceUri, -TimeUnit.MINUTES.toMillis(5))
+        CharSequence work = mListSummaries.get(0, "");
+        CharSequence home = mListSummaries.get(1, "");
+        CharSequence school = mListSummaries.get(2, "");
+        Slice s = new ListBuilder(getContext(), sliceUri, -TimeUnit.MINUTES.toMillis(50))
                 .addRow(b -> b
                         .setTitle("Work")
-                        .setSubtitle(mListSummaries.get(0, ""), updating)
+                        .setSubtitle(work,
+                                updating || TextUtils.isEmpty(work))
                         .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_work),
                                 ICON_IMAGE))
                 .addRow(b -> b
                         .setTitle("Home")
-                        .setSubtitle(mListSummaries.get(1, ""), updating)
+                        .setSubtitle(mListSummaries.get(1, ""),
+                                updating || TextUtils.isEmpty(home))
                         .addEndItem(
                                 Icon.createWithResource(getContext(), R.drawable.ic_home),
                                 ICON_IMAGE))
                 .addRow(b -> b
                         .setTitle("School")
-                        .setSubtitle(mListSummaries.get(2, ""), updating)
+                        .setSubtitle(mListSummaries.get(2, ""),
+                                updating || TextUtils.isEmpty(school))
                         .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_school),
                                 ICON_IMAGE))
                 .build();
         return s;
     }
 
+    // TODO: Should test large image grids
     private Slice createLoadingGridSlice(Uri sliceUri) {
         boolean updating = mGridLastUpdate == 0
                 || mGridLastUpdate < (System.currentTimeMillis() - 10 * System.currentTimeMillis());
@@ -613,26 +621,36 @@
             update(1500, mGridSummaries, 3, "33 min", sliceUri, r);
             update(1000, mGridSummaries, 4, "12 min", sliceUri, r);
         }
+        CharSequence title = mGridSummaries.get(0, "");
+        CharSequence subtitle = mGridSummaries.get(1, "");
+        CharSequence home = mGridSummaries.get(2, "");
+        CharSequence work = mGridSummaries.get(3, "");
+        CharSequence school = mGridSummaries.get(4, "");
         Slice s = new ListBuilder(getContext(), sliceUri, INFINITY)
                 .setHeader(hb -> hb
-                        .setTitle(mGridSummaries.get(0, ""), updating)
-                        .setSubtitle(mGridSummaries.get(1, ""), updating))
+                        .setTitle(title,
+                                updating || TextUtils.isEmpty(title))
+                        .setSubtitle(subtitle,
+                                updating || TextUtils.isEmpty(subtitle)))
                 .addGrid(gb -> gb
                     .addCell(cb -> cb
                             .addImage(Icon.createWithResource(getContext(), R.drawable.ic_home),
                                     ICON_IMAGE)
                             .addTitleText("Home")
-                            .addText(mGridSummaries.get(2, ""), updating))
+                            .addText(home,
+                                    updating || TextUtils.isEmpty(home)))
                     .addCell(cb -> cb
                             .addImage(Icon.createWithResource(getContext(), R.drawable.ic_work),
                                     ICON_IMAGE)
                             .addTitleText("Work")
-                            .addText(mGridSummaries.get(3, ""), updating))
+                            .addText(work,
+                                    updating || TextUtils.isEmpty(work)))
                     .addCell(cb -> cb
                             .addImage(Icon.createWithResource(getContext(), R.drawable.ic_school),
                                     ICON_IMAGE)
                             .addTitleText("School")
-                            .addText(mGridSummaries.get(4, ""), updating)))
+                            .addText(school,
+                                    updating || TextUtils.isEmpty(school))))
                     .build();
         return s;
     }
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowContent.java b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
index 8f30f53..7565895 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
@@ -17,6 +17,7 @@
 package androidx.slice.widget;
 
 import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_PARTIAL;
 import static android.app.slice.Slice.HINT_SEE_MORE;
 import static android.app.slice.Slice.HINT_SHORTCUT;
 import static android.app.slice.Slice.HINT_SUMMARY;
@@ -273,7 +274,9 @@
     }
 
     private static boolean hasText(SliceItem textSlice) {
-        return textSlice != null && !TextUtils.isEmpty(textSlice.getText());
+        return textSlice != null
+                && (textSlice.hasHint(HINT_PARTIAL)
+                    || !TextUtils.isEmpty(textSlice.getText()));
     }
 
     /**
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowView.java b/slices/view/src/main/java/androidx/slice/widget/RowView.java
index b5f55a7..71d7fb0 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowView.java
@@ -18,6 +18,7 @@
 
 import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
 import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_PARTIAL;
 import static android.app.slice.Slice.HINT_SHORTCUT;
 import static android.app.slice.Slice.SUBTYPE_TOGGLE;
 import static android.app.slice.SliceItem.FORMAT_ACTION;
@@ -318,7 +319,9 @@
                     SliceViewUtil.getRelativeTimeString(mLastUpdated));
         }
         CharSequence subtitle = subtitleItem != null ? subtitleItem.getText() : null;
-        if (!TextUtils.isEmpty(subtitle)) {
+        boolean subtitleExists = !TextUtils.isEmpty(subtitle)
+                        || (subtitleItem != null && subtitleItem.hasHint(HINT_PARTIAL));
+        if (subtitleExists) {
             mSecondaryText.setText(subtitle);
             mSecondaryText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mIsHeader
                     ? mHeaderSubtitleSize
@@ -337,7 +340,7 @@
             mLastUpdatedText.setTextColor(mSubtitleColor);
         }
         mLastUpdatedText.setVisibility(TextUtils.isEmpty(subtitleTimeString) ? GONE : VISIBLE);
-        mSecondaryText.setVisibility(TextUtils.isEmpty(subtitle) ? GONE : VISIBLE);
+        mSecondaryText.setVisibility(subtitleExists ? VISIBLE : GONE);
     }
 
     private void addRange(final SliceItem range) {
