Android DatabindingUtils:如何为整个项目使用单个适配器?

时间:2016-08-07 20:23:35

标签: android android-databinding

我非常希望在Android上使用新的数据绑定支持最终摆脱与RecyclerViews相关的所有样板,但却发现官方Android数据绑定文档几乎没有提到这个主题。

所以,即使你发现了一些博客帖子,其中包含了一些提示'关于这个问题,我还在寻找一个关于如何避免每个recyclerview实例创建一个适配器的完整示例实现。

这里有一些参考代码,但它不完整: https://stfalcon.com/en/blog/post/faster-android-apps-with-databinding#takeaways

1 个答案:

答案 0 :(得分:1)

使用代表有很好的解决方案 - http://hannesdorfmann.com/android/adapter-delegates 我使用它的方法对DataBinding进行了简单的更改。

如果您正在寻找简单的方法,请查看此库https://github.com/drstranges/DataBinding_For_RecyclerView

无论如何,即使你使用普通方式,魔法也在可绑定的ViewHolder中:

public class BindingHolder<VB extends ViewDataBinding> extends RecyclerView.ViewHolder {

    private VB mBinding;

    public static <VB extends ViewDataBinding> BindingHolder<VB> newInstance(
            @LayoutRes int layoutId, LayoutInflater inflater,
            @Nullable ViewGroup parent, boolean attachToParent) {

        VB vb = DataBindingUtil.inflate(inflater, layoutId, parent, attachToParent);
        return new BindingHolder<>(vb);
    }

    public BindingHolder(VB binding) {
        super(binding.getRoot());
        this.mBinding= binding;
    }

    public VB getBinding() {
        return mBinding;
    }
}
onCreateViewHolder

中的

{
    BindingHolder holder = BindingHolder.newInstance(R.layout.item,
            LayoutInflater.from(parent.getContext()), parent, false);
    //set listeners and action handlers
    return holder;
}
onBindViewHolder

中的

{
    ItemBinding binding = holder.getBinding();
    Item item = items.get(position);
    binding.setItem(item);
    binding.executePendingBindings();
}
// or 
{
    ViewDataBinding binding = holder.getBinding();
    Object item = items.get(position);
    binding.setVariable(BR.item, item);
    binding.executePendingBindings();
}