简述
RecyclerView是易于扩展的视图,为有限的数据集合提供窗口呈现。
RecyclerView
extends ViewGroup
implements ScrollingView NestedScrollingChild
已知的直接子类 | |
---|---|
HorizontalGridView | ViewGroup显示水平滚动列表中的条目。 |
VerticalGridView | ViewGroup显示垂直滚动列表中的条目。 |
术语表
Adapter: 是RecyclerView.Adapter的子类,负责将数据集合转化为Views。
Position:Adapter中的数据集合的下标。
Index:已经attached 的child view 的下标,例如:getChildAt(int)。
Binding:处理子视图,并将适配器中的数据与子视图绑定的过程。
Recycle(View):以前一个视图用于显示数据为一个特定的适配器的位置可以放置在一个缓存,以备重用以后再显示同样的数据。通过跳过解析布局文件或重新构建视图实例,从而大大提高性能。
Scrap (view):
1. 在 layout 阶段,子视图短暂性进入分离状态。Scrap允许在没有完全脱离 RecyclerView 之前进行重用、修改。那些不再需要重新绑定到或修改适配器操作的 View 将被认定为是 Dirty。
2.scrapped view
是指view 仍然 attached 在其父视图 RecyclerView 上,但是已经被标记为 removal或reuse。Dirty (view):子视图必须先与适配器重新绑定,才能够被正确显示。
Positions in RecyclerView:
RecyclerView介绍了在抽象层上的关联,RecyclerView.Adapter与RecyclerView.LayoutManager能够在 layout 计算阶段批量检测数据集的变更。这样节省了 LayoutManager 跟踪 adapter 的变更计算动画的时间。它同样也在性能上有所提升,因为所有的视图都会在同一时刻绑定,且避免了不必要的绑定。
因由上述原因,此处列出了两种 position 在 RecyclerView关联的方法:
1. layout position:最新的layout 计算中,item 所处的下标。
2. adapter position:adapter 中数据 item 所处的下标。
这两者 position 均是一致的,除了分发 adapter.notify*的时间及计算 updated layout。
方法返回或接收*LayoutPosition*
,均使用最新的 layout 计算后的 position。(例如:getLayoutPosition()
,findViewHolderForLayoutPosition(int)
)。当有 layout 计算更新时,上述所有方法也会随着更新。因此你可以依靠 position 来确定用户可见区域信息。(例如,当用户有诉求看第5个元素时,你可以使用这些方法来呈现第5个元素。)
另一种 position 的集合的形式类似于*AdapterPosition*
。(例如:getAdapterPosition()
,findViewHolderForAdapterPosition(int)
)。当你需要实时的获取 adapter 的 position 的数据时,甚至于它们尚未被关联布局时,使用这些方法是合理的。比如,当你希望访问某个 ViewHolder的click 事件,你应该使用getAdapterPosition()
。注意,这些方法不会因为调用notifyDataSetChanged()
或其他新的 layout 而使之更新。因此,你需要小心的处理NO_POSITION
或者null
的情况。
当重写RecyclerView.LayoutManager
时,大多数时候建议使用 layout positions
。而重写RecyclerView.Adapter
时则建议使用 adapter position
。