[Andorid]使用BindingCollectionAdapter后recyclerView刷新闪烁的问题

最近在是使用一款mvvm框架,其中就用到了BindingCollectionAdapter绑定神器,有兴趣的朋友可以去看看,说实话我个人不是很喜欢这样的工具,因为业务复杂的情况下,开发和维护成本都很高,当然这是我个人见解。这个方案就是能支持databinding和recyclerview、listview的数据绑定,因为是首次使用,就遇到了之前没有遇到的刷新闪烁的问题。每次进入列表,刷新数据后,都会闪烁一下,个人猜想出现这种情况的可能性有几点:

  1. recyclerview本身的动画加载的问题
  2. 对应的适配器中没有复用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 extends BindingRecyclerViewAdapter {

    @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的方式去设置即可;

你可能感兴趣的:(学习记录,Android,java,android)