以编程方式添加到LinearLayout的单个视图的Android数据绑定?

时间:2016-04-14 21:57:04

标签: android xml layout data-binding android-inflate

我能够获得"活动范围"数据绑定工作没有任何任何困难。但是,当我尝试为特定视图设置绑定时,比如我以编程方式添加到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,那为什么会这样呢?

我正在深入了解源代码以了解绑定如何在活动中发挥作用,我确信这将有我的答案,但如果有其他人可以在我花费多个小时之前插入,我会很感激先发制人!

我将在此报告所有调查结果,非常感谢

1 个答案:

答案 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;
       }
   }
});