最近在是使用一款mvvm框架,其中就用到了BindingCollectionAdapter绑定神器,有兴趣的朋友可以去看看,说实话我个人不是很喜欢这样的工具,因为业务复杂的情况下,开发和维护成本都很高,当然这是我个人见解。这个方案就是能支持databinding和recyclerview、listview的数据绑定,因为是首次使用,就遇到了之前没有遇到的刷新闪烁的问题。每次进入列表,刷新数据后,都会闪烁一下,个人猜想出现这种情况的可能性有几点:
- recyclerview本身的动画加载的问题
- 对应的适配器中没有复用viewholder,或者每次都是重复的刷新视图,导致每次都是重新构建view
于是通过不同的方式尝试修复,用了最简单的方案,可以看注释;希望对遇到相同问题的人有参考价值。
因为项目中用的是android的mvvm的架构,所以这里用到了databinding的方式(java代码)
@BindingAdapter("bindNoAnimAdapter")
public static void bindNoAnimAdapter(RecyclerView recyclerView,BaseBindingRecyclerViewAdapter adapter) {
//防止重复刷新,需重写adapter的getItemId方法
adapter.setHasStableIds(true);
//直接清除动画
recyclerView.setItemAnimator(null);
//去除滑动阴影
recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER);
recyclerView.setAdapter(adapter);
}
adapter的代码如下
public class BaseBindingRecyclerViewAdapter<T> extends BindingRecyclerViewAdapter<T> {
@Override
public ViewDataBinding onCreateBinding(LayoutInflater inflater, @LayoutRes int layoutId, ViewGroup viewGroup) {
ViewDataBinding binding = super.onCreateBinding(inflater, layoutId, viewGroup);
return binding;
}
@Override
public void onBindBinding(ViewDataBinding binding, int bindingVariable, @LayoutRes int layoutId, int position, T item) {
super.onBindBinding(binding, bindingVariable, layoutId, position, item);
}
@Override
public long getItemId(int position) {
return position;
}
}
在xml里直接通过databinding的方式去设置即可;
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rl_search"
app:itemBinding="@{vm.itemBinding}"
app:items="@{vm.observableList}"
layoutManager="@{LayoutManagers.linear()}"
bindNoAnimAdapter="@{vm.adapter}"/>