我能够获得"活动范围"数据绑定工作没有任何任何困难。但是,当我尝试为特定视图设置绑定时,比如我以编程方式添加到LinearLayout的膨胀视图,我尝试过的任何内容都无效。
例如,将数据绑定到Activity的视图是微不足道的。通常在onCreate()方法中,只需要添加:
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
那就是它!视图main_activity.xml将被"绑定"通过一些魔术来绑定(这是我的问题),变量替换将在main_activity.xml中按预期工作。
我查阅了Google有关RecyclerView使用的文档,并尝试在我的虚增视图中使用此方法。我通过为每个ViewHolder创建一个ListItemBinding(我的.xml只是名为list_item.xml并且该文件是从.xml布局自动生成)来完成此操作,ListItemBinding传递给ViewHolder以作为参考通过每个ViewHolder的构造函数。
现在当然这不起作用,我猜这是因为我的View和Binding之间没有明确的联系,但是,上面的Activity之间没有关系还有Binding,那为什么会这样呢?
我正在深入了解源代码以了解绑定如何在活动中发挥作用,我确信这将有我的答案,但如果有其他人可以在我花费多个小时之前插入,我会很感激先发制人!
我将在此报告所有调查结果,非常感谢
答案 0 :(得分:10)
您可以将动态膨胀的数据绑定视图添加到LinearLayout。您必须以编程方式设置数据绑定视图的数据。
void addViewToViewGroup(ViewGroup viewGroup, User user) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, viewGroup,true);
binding.setUser(user);
}
如果您附加了已知的绑定,则可以从那里提取数据。在这里,我假设包含的ViewGroup在布局outer.xml
中并生成绑定OuterBinding
。
void addViewToViewGroup(ViewGroup viewGroup) {
OuterBinding outer = DataBindingUtil.findBinding(viewGroup);
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, viewGroup, true);
binding.setUser(outer.getUser());
}
您可以看到OuterBinding
的用户和MyLayoutBinding
用户之间没有直接绑定。这意味着如果您更新它,您将看不到它反映出来。使用包含的布局,框架确实可以绑定您必须手动执行的操作。要获得动态更新,您可以这样做:
outer.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if (propertyId == BR.user) {
binding.setUser(outer.getUser());
break;
}
}
});