tryBindViewHolderByDeadline
时间: 2023-07-31 18:03:56 浏览: 34
`tryBindViewHolderByDeadline` 是 RecyclerView 中的一个方法,用于在限制的时间内尝试绑定 ViewHolder。
在 RecyclerView 中,当需要显示一个 item 时,会调用 RecyclerView.Adapter 中的 `onBindViewHolder` 方法。在该方法中,需要将 ViewHolder 中的数据绑定到 item 的视图中。但是,如果数据量较大,或者绑定数据的操作比较耗时,会导致 RecyclerView 的滑动不流畅,用户体验变差。
为了避免这种情况,RecyclerView 提供了 `tryBindViewHolderByDeadline` 方法。该方法会限制绑定 ViewHolder 的时间,如果在限制时间内绑定成功,则显示当前 item,否则停止绑定操作。
使用 `tryBindViewHolderByDeadline` 方法需要在 `onBindViewHolder` 方法中调用。具体实现方式如下:
```java
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
RecyclerView.State state = mRecyclerView.getAdapter().getStateRestorationPolicy()
.shouldRestoreState() ? mRecyclerView.getState() : null;
mPreLayoutHolderMap.put(holder, new UpdateOp.Callback.UpdateHolderState(
holder, UpdateOp.Callback.UpdateHolderState.FLAG_APPEARED_IN_PRE_LAYOUT,
position, state));
try {
TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
long startNs = System.nanoTime();
onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
long durationNs = System.nanoTime() - startNs;
final long deadlineNs = getNanoTime() + sFrameIntervalNs - durationNs;
if (deadlineNs < 0) {
throw new IllegalStateException("RecyclerView has too much work to do in a frame ("
+ durationNs + " vs " + sFrameIntervalNs + ")");
}
View view = holder.itemView;
ViewCompat.postOnAnimation(view, new Runnable() {
@Override
public void run() {
if (mRunningPayloads == null) {
mRunningPayloads = new ArrayList<>();
}
mRunningPayloads.clear();
boolean payloads = !mPreLayoutHolderMap.isEmpty();
mRunningPayloads.addAll(holder.getUnmodifiedPayloads());
mPreLayoutHolderMap.remove(holder);
if (payloads) {
tryBindViewHolderByDeadline(holder, deadlineNs);
} else {
onBindViewHolder(holder, holder.mBindingAdapterPosition,
holder.getUnmodifiedPayloads());
mViewInfoStore.removeViewHolder(holder);
}
}
}, deadlineNs / 1000000L);
} finally {
TraceCompat.endSection();
}
}
```
其中,`getNanoTime()` 方法用于获取当前时间,`sFrameIntervalNs` 表示一帧的时间,`deadlineNs` 表示限制的时间。
在 `tryBindViewHolderByDeadline` 方法中,会在限制时间内执行 `onBindViewHolder` 方法。如果绑定成功,则将 ViewHolder 显示在 RecyclerView 中;否则停止绑定操作。
使用 `tryBindViewHolderByDeadline` 方法可以有效提高 RecyclerView 的滑动流畅度和用户体验。