You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
publicvoidsetItems(List<T> items) {
if (this.items == items) {
return;
}
// If a recyclerview is listening, set up listeners. Otherwise wait until one is attached.// No need to make a sound if nobody is listening right?if (recyclerView != null) {
if (this.itemsinstanceofObservableList) {
((ObservableList<T>) this.items).removeOnListChangedCallback(callback);
callback = null;
}
if (itemsinstanceofObservableList) {
callback = newWeakReferenceOnListChangedCallback<>(this);
((ObservableList<T>) items).addOnListChangedCallback(callback);
}
}
this.items = items;
notifyDataSetChanged();
}
引言
上回解決了ItemSource和ItemTemplate的设置和绑定问题。
但是没有解决数据动态更新的问题
RecyclerView.Adapter的更新机制
部分参考DiffUtil and data binding with RecyclerView
必须在合适的场景使用合适的api(比如notifyDataSetChanged虽然一招鲜吃遍天下鲜,肯定性能低下)
ShadowAdapter 的Observable对象改造
新增一个OnListChangedCallback的类,里面完成所有相关的数据变化通知
在ShadowAdapter文件中实现加载和卸载RecyclerView重载回调
在加载的时候吧钩子加上,在卸载的时候把钩子去掉
BindingAdapter改造
BindingAdapter潜在性能问题
偶然调试过程中发现BindingAdapter的静态函数会被反复调用,并不符合我的预期
发现我每次列表加元素也会执行,这就有点不可理解了。加了断点
找到绑定自动生成代码ActivitySearchBindingImpl extends ActivitySearchBinding
这个回调,任意元素的变化都会调用mDirtyFlags 会赋值为2.
然后看调用的地方
((dirtyFlags & 0x7L) != 0) 让我想到Linux文件的权限777,
二进制的三位任意的变化都会触发绑定函数执行。虽然没法完全理解框架的意图。我的函数需要做如下改造
1 adapter 增加判断是否已经赋值
2 判断items是否重复赋值
Challenge for end
这些问题有些难度,目前这阶段有点超纲了,等学习完成其他的目标后再来回顾这些问题
代码参考出处
一个很复杂的绑定库
binding-collection-adapter
The text was updated successfully, but these errors were encountered: