开发者控制台

步骤4: 通过Presenter编辑用户界面

步骤4: 通过Presenter编辑用户界面

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)。虽然电视屏幕上没有现有的触摸交互,但此步骤是必要的,因为这是Android目前管理视图是否可获得焦点的方式。

现在,让我们一起看看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中检索的,然后我们用setTitleText()setContentText()这两个简单的setter来编辑视图的主要字段。

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

后续步骤

继续执行下一步: 步骤5: 通过DetailsFragment提供应用内容的详细信息