在LinearLayout中以编程方式添加的单个视图上使用Android数据绑定?

10
我可以轻松地实现“活动级别”的数据绑定,但是当我尝试为特定的视图设置绑定时,例如我通过编程方式添加到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之间也没有联系,那为什么那个可以工作呢?我正在深入挖掘源代码以查看绑定如何在活动上工作,我相信那里将有我的答案,但如果有人在我花费多个小时之前能够帮忙解决的话,我会很感激的。我会在这里报告所有的发现,非常感谢。

使用Android Data Binding与RecyclerView有一些技巧。请查看此演讲https://realm.io/news/data-binding-android-boyar-mount/ - 在大约22分钟处,Yigit讲解了如何使用数据绑定与RecyclerView。 - George Mount
@GeorgeMount 我其实不想使用RecyclerView,因为每个列表最多只有5个视图,所以没有太多的回收利用... 无论如何,我还是改用了正确的RecyclerView,而不是使用LinearLayout并逐个添加视图。这非常容易,额外的开销可能值得采取直接的方法。 - AutoM8R
1个回答

19
您可以向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;
       }
   }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接