步骤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);
...
}
}
此处需要注意两件事情:
- 正如我们之前提到的,
CardPresenter
是基于ViewHolder
模式建立的。这可以确保视图被正确回收,并且不会浪费内存。 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提供应用内容的详细信息。