通过 Presenter 编辑用户界面


通过 Presenter 编辑用户界面

上次更新时间:2016 年 12 月。

让我们仔细看看 Presenter 类。Presenter 类允许我们定义我们支持 Leanback 的应用的外观和风格,而无需编辑底层数据结构。

Presenter 类

我们创建的 Leanback 模板是按照通用开发模式“模型-视图-控制器”(MVC) 的自定义版本构建的,其中 Presenter 类充当视图Presenter 作为参数传递给 ArrayObjectAdapter,并定义如何显示适配器的内容

Leanback 方法提供了各种预定义的 Presenter

  • CardPresenter 定义单数内容
  • ListRowPresenter 定义如何显示和排列一行中的各种内容
  • DetailsDescriptionPresenter 定义 DetailsFragment 的 UI

实施 Presenter 的方法非常相似:它们都遵循 ViewHolder 模式,主要由自定义视图组成,并具有设置视图字段的方法。

让我们以自定义 CardPresenter 为例,来仔细了解一下。

自定义 CardPresenter

BrowseFragment 中,我们看到 CardPresenter 定义了单个适配器项目的 UI。

public class MainFragment extends BrowseFragment {

        CardPresenter cardPresenter = new CardPresenter();

        //创建行的适配器并添加所有电影
        ArrayObjectAdapter listRowAdapter
			= new ArrayObjectAdapter(cardPresenter);

上图中突出显示的视图是一个名为 ImageCardView 的自定义视图,用于在 CardPresenter 中定义单个组件的 UI。

让我们分析如何在 CardPresenter 中初始化视图。

public class CardPresenter extends Presenter {

	public ViewHolder onCreateViewHolder(ViewGroup parent) {
   	...

  	ImageCardView cardView = new ImageCardView(parent.getContext);
    	cardView.setFocusable(true);
   	cardView.setFocusableInTouchMode(true);
    	return new ViewHolder(cardView);

   ...
}

这里有两件事要注意:

  1. 正如我们之前提到的,CardPresenter 建立在 ViewHolder 模式之上。这可以确保视图被正确回收,并且不会浪费内存。
  2. CardView设置为 SetFocusable(true)setFocusableInTouchMode(true)。虽然电视屏幕上没有现有的触摸交互,但此步骤是必要的,因为这是安卓目前管理视图是否可获得焦点的方式。

现在,让我们来看看 ImageCardView(和 Presenter)的组件是如何设置的:

public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
    Movie movie = (Movie) item;
    ImageCardView cardView = (ImageCardView) viewHolder.view;
	if (movie.getCardImageUrl() != null) {
        		cardView.setTitleText(movie.getTitle());
        		cardView.setContentText(movie.getDescription());
			Glide.with(viewHolder.view.getContext())
                		.load(movie.getCardImageUrl())
                		.centerCrop()
				.into(cardView.getMainImageView());
    }
}

在这个例子中,我们使用自己的自定义类“Movie”来检索我们想要显示的信息。

cardView 是从 ViewHolder 中检索的,然后我们有简单的 setter setTitleText()setContentText() 来编辑视图的主要字段。

为了检索缩略图的图像,Leanback 会自动使用 Glide 库(但您可以轻松地将其替换为您选择的图像加载库)。