LeanBack是Google官方推出的TV端的功能库,里面包含了很多在TV Android端开发常用的控件,本文重点介绍其对RecyclerView适配TV端做的封装:HorizontalGridView、VerticalGridView。
HorizontalGridView和VerticalGridView都继承自RecyclerView,针对TV的特性,在item排版、焦点流转、上/失焦动画、记住焦点、焦点item对齐位置等方面做了比较好的封装,其继承结果如下
![HorizontalGridView和VerticalGridView继承结构](https://i-blog.csdnimg.cn/blog_migrate/493e5bd50a5c6e83c06bfa9ecaa0f43b.png)
从上图可见,HorizontalGridView和VerticalGridView皆继承自BaseGridView,BaseGridView则继承自RecyclerView,BaseGridView实现了大部分上述的封装,包括列表的滑动、焦点事件的分发等等。其中,BaseGridView持有了GridLayoutManager的引用,实际上,BaseGridView大量的方法都流转到GridLayoutManager,所以上述的功能的实现其实是在GridLayoutManager实现的。
注意这里的GridLayoutManager跟平常使用GridLayoutManager不是同一个,上图中可以看到,它直接继承自RecyclerView.LayoutManager,我们知道,RecyclerView将列表的具体展示模式交由LayoutManager实现和管理,因此只要切换不同的LayoutManager就可以实现不同的列表模式。这里的GridLayoutManager则是针对TV特性,实现了前面所述的功能的一个实现。这里暂时不对具体实现做深入的探讨,着重介绍HorizontalGridView和VerticalGridView的使用方法。
这里只对HorizontalGridView做介绍,VerticalGridView类似。
HorizontalGridView的封装采用了MVP模式,涉及的几个类及其功能如下:
- HorizontalGridView:RecyclerView的子类;
- GridLayoutManager:适配的LayoutManager,支持横向的多行列表和纵向的多列列表,已包含在BaseGridView里,不需要额外设置,这点要注意;
- ObjectAdapter:承担MVP中model的职责,负责提供数据访问接口
- Presenter:职责类似RecyclerView的adapter,辅助item视图的创建和数据绑定等
- PresenterSelector:根据不同的数据类型选择不同的Presenter,用于多item type列表模型
- ItemBridgeAdapter:HorizontalGridView和ObjectAdapter的桥梁,用于解耦双方
- FocusHighlightHandler:item上焦的处理接口
- FocusHighlightHelper:上焦动画帮助类,内置了两种上焦动画
简单用法如下:
- 布局中添加HorizontalGridView
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"