# FacetProvider

Artifact: [androidx.leanback:leanback-grid](https://developer.android.com/jetpack/androidx/releases/leanback) [View Source](https://cs.android.com/search?q=file:androidx/leanback/widget/FacetProvider.java+class:androidx.leanback.widget.FacetProvider) Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/leanback#1.0.0)

*** ** * ** ***


```
public interface FacetProvider
```

<br />

Known direct subclasses [GuidedActionsStylist.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/GuidedActionsStylist.ViewHolder), [ItemBridgeAdapter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/ItemBridgeAdapter.ViewHolder), [Presenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/Presenter.ViewHolder), [Presenter](https://developer.android.com/reference/androidx/leanback/widget/Presenter)

|---|---|
| `https://developer.android.com/reference/androidx/leanback/widget/GuidedActionsStylist.ViewHolder` | ViewHolder caches information about the action item layouts' subviews. |
| `https://developer.android.com/reference/androidx/leanback/widget/ItemBridgeAdapter.ViewHolder` | ViewHolder for the ItemBridgeAdapter. |
| `https://developer.android.com/reference/androidx/leanback/widget/Presenter.ViewHolder` | ViewHolder can be subclassed and used to cache any view accessors needed to improve binding performance (for example, results of findViewById) without needing to subclass a View. |
| `https://developer.android.com/reference/androidx/leanback/widget/Presenter` | A Presenter is used to generate `https://developer.android.com/reference/android/view/View.html`s and bind Objects to them on demand. |

Known indirect subclasses [AbstractDetailsDescriptionPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.ViewHolder), [AbstractDetailsDescriptionPresenter](https://developer.android.com/reference/androidx/leanback/widget/AbstractDetailsDescriptionPresenter), [AbstractMediaItemPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaItemPresenter.ViewHolder), [AbstractMediaItemPresenter](https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaItemPresenter), [AbstractMediaListHeaderPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaListHeaderPresenter.ViewHolder), [AbstractMediaListHeaderPresenter](https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaListHeaderPresenter), [DetailsOverviewLogoPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewLogoPresenter.ViewHolder), [DetailsOverviewLogoPresenter](https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewLogoPresenter), [DetailsOverviewRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewRowPresenter.ViewHolder), [DetailsOverviewRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewRowPresenter), [DividerPresenter](https://developer.android.com/reference/androidx/leanback/widget/DividerPresenter), [FullWidthDetailsOverviewRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter.ViewHolder), [FullWidthDetailsOverviewRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter), [ListRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/ListRowPresenter.ViewHolder), [ListRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/ListRowPresenter), [PlaybackControlsRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRowPresenter.ViewHolder), [PlaybackControlsRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRowPresenter), [PlaybackRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/PlaybackRowPresenter.ViewHolder), [PlaybackRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/PlaybackRowPresenter), [PlaybackTransportRowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/PlaybackTransportRowPresenter.ViewHolder), [PlaybackTransportRowPresenter](https://developer.android.com/reference/androidx/leanback/widget/PlaybackTransportRowPresenter), [RowHeaderPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/RowHeaderPresenter.ViewHolder), [RowHeaderPresenter](https://developer.android.com/reference/androidx/leanback/widget/RowHeaderPresenter), [RowPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/RowPresenter.ViewHolder), [RowPresenter](https://developer.android.com/reference/androidx/leanback/widget/RowPresenter), [VerticalGridPresenter.ViewHolder](https://developer.android.com/reference/androidx/leanback/widget/VerticalGridPresenter.ViewHolder), [VerticalGridPresenter](https://developer.android.com/reference/androidx/leanback/widget/VerticalGridPresenter)

|---|---|
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.ViewHolder` | The ViewHolder for the `https://developer.android.com/reference/androidx/leanback/widget/AbstractDetailsDescriptionPresenter`. |
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractDetailsDescriptionPresenter` | An abstract `https://developer.android.com/reference/androidx/leanback/widget/Presenter` for rendering a detailed description of an item. |
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaItemPresenter.ViewHolder` | The ViewHolder for the `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaItemPresenter`. |
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaItemPresenter` | Abstract `https://developer.android.com/reference/androidx/leanback/widget/Presenter` class for rendering media items in a playlist format. |
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaListHeaderPresenter.ViewHolder` | The ViewHolder for the `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaListHeaderPresenter`. |
| `https://developer.android.com/reference/androidx/leanback/widget/AbstractMediaListHeaderPresenter` | Abstract presenter class for rendering the header for a list of media items in a playlist. |
| `https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewLogoPresenter.ViewHolder` | ViewHolder for Logo view of DetailsOverviewRow. |
| `https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewLogoPresenter` | Presenter that responsible to create a ImageView and bind to DetailsOverviewRow. |
| `https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewRowPresenter.ViewHolder` | **This class is deprecated.** Deprecated in Java |
| `https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewRowPresenter` | **This class is deprecated.** Use `https://developer.android.com/reference/androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter` <br /> |
| `https://developer.android.com/reference/androidx/leanback/widget/DividerPresenter` | DividerPresenter provides a default presentation for `https://developer.android.com/reference/androidx/leanback/widget/DividerRow` in HeadersFragment. |
| `https://developer.android.com/reference/androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter.ViewHolder` | A ViewHolder for the DetailsOverviewRow. |
| `https://developer.android.com/reference/androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter` | Renders a `https://developer.android.com/reference/androidx/leanback/widget/DetailsOverviewRow` to display an overview of an item. |
| `https://developer.android.com/reference/androidx/leanback/widget/ListRowPresenter.ViewHolder` | ViewHolder for the ListRowPresenter. |
| `https://developer.android.com/reference/androidx/leanback/widget/ListRowPresenter` | ListRowPresenter renders `https://developer.android.com/reference/androidx/leanback/widget/ListRow` using a `https://developer.android.com/reference/androidx/leanback/widget/HorizontalGridView` hosted in a `https://developer.android.com/reference/androidx/leanback/widget/ListRowView`. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRowPresenter.ViewHolder` | A ViewHolder for the PlaybackControlsRow. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRowPresenter` | A PlaybackControlsRowPresenter renders a `https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRow` to display a series of playback control buttons. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackRowPresenter.ViewHolder` | This container is used for trapping click events and passing them to the playback controls. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackRowPresenter` | Subclass of `https://developer.android.com/reference/androidx/leanback/widget/RowPresenter` that can define the desired behavior when the view reappears. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackTransportRowPresenter.ViewHolder` | A ViewHolder for the PlaybackControlsRow supporting seek UI. |
| `https://developer.android.com/reference/androidx/leanback/widget/PlaybackTransportRowPresenter` | A PlaybackTransportRowPresenter renders a `https://developer.android.com/reference/androidx/leanback/widget/PlaybackControlsRow` to display a series of playback control buttons. |
| `https://developer.android.com/reference/androidx/leanback/widget/RowHeaderPresenter.ViewHolder` | A ViewHolder for the RowHeaderPresenter. |
| `https://developer.android.com/reference/androidx/leanback/widget/RowHeaderPresenter` | RowHeaderPresenter provides a default presentation for `https://developer.android.com/reference/androidx/leanback/widget/HeaderItem` using a `https://developer.android.com/reference/androidx/leanback/widget/RowHeaderView` and optionally a TextView for description. |
| `https://developer.android.com/reference/androidx/leanback/widget/RowPresenter.ViewHolder` | A ViewHolder for a `https://developer.android.com/reference/androidx/leanback/widget/Row`. |
| `https://developer.android.com/reference/androidx/leanback/widget/RowPresenter` | An abstract `https://developer.android.com/reference/androidx/leanback/widget/Presenter` that renders an Object in RowsFragment, the object can be subclass `https://developer.android.com/reference/androidx/leanback/widget/Row` or a generic one. |
| `https://developer.android.com/reference/androidx/leanback/widget/VerticalGridPresenter.ViewHolder` | ViewHolder for the VerticalGridPresenter. |
| `https://developer.android.com/reference/androidx/leanback/widget/VerticalGridPresenter` | A presenter that renders objects in a `https://developer.android.com/reference/androidx/leanback/widget/VerticalGridView`. |

*** ** * ** ***

This is the query interface to supply optional features(aka facets) on an object without the need of letting the object to subclass or implement java interfaces. Facets allow leanback to re-compose optional features from leanback ViewHolder to RecyclerView ViewHolder. A typical "facet" class is `https://developer.android.com/reference/androidx/leanback/widget/ItemAlignmentFacet` that defines how to align a ViewHolder inside VerticalGridView or HorizontalGridView. A FacetProvider could be retrieved from two sources by VerticalGridView/HorizontalGridView in the following order.

- ViewHolder based facet:

  RecyclerView.ViewHolder can implement FacetProvider. If app uses leanback Presenter.ViewHolder, the facet of Presenter.ViewHolder will be relayed by ItemBridgeAdapter.ViewHolder which is a wrapper of Presenter.ViewHolder. ViewHolder based facet is used less frequently than item view type based facet because in most cases ViewHolders of same type share the same alignment definition.

  For example, app calls viewHolder.setFacet(ItemAlignmentFacet.class, itemAlignmentFacet) to set alignment of the ViewHolder instance.
- RecyclerView item view type based facet:

  RecyclerView.Adapter can implement `https://developer.android.com/reference/androidx/leanback/widget/FacetProviderAdapter` which returns FacetProvider for each item view type. If app uses leanback ObjectAdapter and Presenter, app wraps the ObjectAdapter and Presenter using `https://developer.android.com/reference/androidx/leanback/widget/ItemBridgeAdapter`. The implementation of `https://developer.android.com/reference/androidx/leanback/widget/ItemBridgeAdapter#getFacetProvider(int)` will return the FacetProvider implemented by `https://developer.android.com/reference/androidx/leanback/widget/Presenter` which is mapped to the item view type.

  For example, app calls presenter.setFacet(ItemAlignmentFacet.class, itemAlignmentFacet) to set alignment of all ViewHolders created by this Presenter.

## Summary

| ### Public methods |
|---|---|
| `abstract @https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/java/lang/Object.html` | `https://developer.android.com/reference/androidx/leanback/widget/FacetProvider#getFacet(java.lang.Class<?>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/Class.html<@https://developer.android.com/reference/androidx/annotation/NonNull ?> facetClass)` Queries optional implemented facet. |

## Public methods

### getFacet

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/leanback#1.0.0)

```
abstract @Nullable Object getFacet(@NonNull Class<@NonNull ?> facetClass)
```

Queries optional implemented facet.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/Class.html<@https://developer.android.com/reference/androidx/annotation/NonNull ?> facetClass` | Facet classes to query, examples are: class of `https://developer.android.com/reference/androidx/leanback/widget/ItemAlignmentFacet`. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/java/lang/Object.html` | Facet implementation for the facetClass or null if feature not implemented. |