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

Android Data Binding on Individual Views Added to LinearLayout Programmatically?

我能够毫无困难地使 "activity-wide" 数据绑定正常工作。但是,当我尝试为特定视图设置绑定时,比如我以编程方式添加到 LinearLayout 的膨胀视图,我尝试过的任何东西都不起作用。

例如,将数据绑定到 Activity 的视图很简单。通常在 onCreate() 方法中,只需添加:

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);

就是这样!视图 main_activity.xml 将通过某种魔法 "bound" 绑定(这是我的问题)并且变量替换将按预期在 main_activity.xml.

中工作

我查阅了 Google 关于 RecyclerView 使用的文档,并试图在我的膨胀视图中使用此方法。我通过为每个 ViewHolder 创建一个 ListItemBinding(我的 .xml 被称为 list_item.xml 并且这个文件是从 .xml 布局自动生成的)来做到这一点,ListItemBinding 被传入通过每个 ViewHolder 的构造函数将 ViewHolder 作为参考。

现在这当然行不通了,我猜这是因为我的视图和绑定之间没有明确的联系,但是,上面的 Activity 和上面的 Activity 之间没有联系两者都绑定,那为什么会起作用?

我正在深入研究源代码以了解绑定如何在 Activity 上工作,我相信这会得到我的答案,但如果其他人可以在我花费多个小时之前插话,我将不胜感激-开始!

我会在这里报告所有发现,非常感谢

您可以将动态扩展的数据绑定视图添加到 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;
       }
   }
});