与UI交互
介绍
数据最终由组件显示在屏幕上之前会在整个 Section 层级结构中流动。 Sections 提供一系列功能,让你可以对数据变化做出响应以及同UI进行交互。
@OnRefresh
当由 Section 层级结构渲染的 UI 需要对内容进行刷新时,带有 @OnRefresh 注解的方法就会被调用。
API
调用 SectionTree#refresh() 方法将刷新请求传递给层级结构中的所有 Sections 。在 Section 中可以这样处理:
@OnViewportChanged
当可见窗口中发生变化时会调用带有 @OnViewportChanged 的方法。
API
调用 SectionTree#viewPortChanged() 和 SectionTree#viewPortChangedFromScrolling() 方法可以让 Sections 知道当前窗口发生了变化。
1) firstVisiblePosition 窗口中第一个可见组件的位置,组件在窗口中部分被隐藏。
2) lastVisiblePosition 窗口中最后一个可见组件的位置,组件在窗口中部分被隐藏。
3) totalCount Section 层级结构中所有条目的总数,这个 Section 是指包含注解方法的那个根节点 Section 。
4) firstFullyVisibleIndex 窗口中第一个完全可组件的位置。
5) lastFullyVisibleIndex 窗口中最后一个完全可见组件的位置。
窗口中的变化
窗口中给的变化可以由下列的这些原因引发的:
1) 添加新的组件到窗口中
2) 从窗口中删除组件
3)滚动列表
4) 窗口中的组件被更新
5) 组件被移入或者移出可见窗口
位置与数量
onViewportChanged 方法中返回的位置与数量是相对于该 section 所含有的组件数而言的。例如:
当 Section C 的第一个组件因为滑动进入窗口中,Section C 的 firstVisiblePosition 值就是 0 ,同时 Section B 的 lastVisiblePosition 的值就是 10 。
@OnDataBound
当此 Section 的层级结构中的数据变化对 SectionTree.Target 可见时,带有这个注解的方法会被调用。
数据变化有这几个原因: 1) 插入 2) 更新 3) 删除 4) 移动
数据发生变化并不意味着这些数据在窗口中变得可见。为了检测可见性,使用 带有 @OnViewportChanged 注解的方法。
requestFocus()
调用这个方法可以时 Section 中的组件获得焦点。如果一个组件在窗口中被隐藏,section 会被滚动以显示这个组件。
在请求获取焦点之前,用于渲染组件的数据必须可用。所以,仅当带有 @OnDataBound 的方法被调用之后再使用 requestFocus() 这个方法。
API
requestFocus() 方法有几种不同的形式。
SectionLifecycle.requestFocus(SectionContext c, int index)
指定组件在 Section 中的索引来获取焦点,其中 Section 的作用域由 SectionContext 给出。
跟 @OnViewportChanged 一样,这里的索引对应于组件所在Section的组件数。
SectionLifecycle.requestFocus(SectionContext c, String sectionKey)
指定Section 的 Key ,让此 Section 中第一个组件获取焦点。
SectionLifecycle.requestFocusWithOffset(SectionContext c, int index, int offset)
与 SectionLifecycle.requestFocus(SectionContext c, int index) 相同,但是带有偏移量。
SectionLifecycle.requestFocusWithOffset(SectionContext c, String sectionKey, int offset)
与 SectionLifecycle.requestFocus(SectionContext c, String sectionKey) 相同,但是带有偏移量。
SectionLifecycle.requestFocus(SectionContext c, String sectionKey, FocusType focusType)
这里的FocusType 有两个值:
1) FocusType.START 让 Section 中的第一个组件获取焦点。
2) FocusType.END 让 Section 中的最后一个组件获取焦点。
@OnEvent(LoadingEvent.class)
当 Section 的子节点处于加载状态时,Section使用带有这个@OnEvent(LoadingEvent.class)注解的方法 来接受加载事件。
API
LoadingState:
1) INITIAL_LOAD 开始加载。
2) LOADING 加载进行中。
3) SUCCEEDED 加载成功。
4) FAILED 加载失败。
isEmpty:
加载完成之后数据集为空时则返回true 。
Throwable t
返回加载失败的原因。
向上传递加载事件
加载事件要向上传递直到某个 Section 决定处理此次加载事件。如果某一 Section 处理加载事件时,这个 Section 的父 Sections 也想要处理此次加载事件,则需要将事件向上传递。
Last updated