以编程方式添加到 LinearLayout 的单个 View 上的 Android 数据绑定(bind)?

标签 android xml layout data-binding android-inflate

我能够毫无困难地获得“Activity 范围内”的数据绑定(bind)。但是,当我尝试为特定 View 设置绑定(bind)时,比如我以编程方式添加到 LinearLayout 的膨胀 View ,我尝试过的任何东西都不起作用。

例如,将数据绑定(bind)到 Activity 的 View 是微不足道的。通常在 onCreate() 方法中,只需添加:

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

就是这样! View main_activity.xml 将通过某种魔法“绑定(bind)”到绑定(bind)(这是我的问题)并且变量替换将按预期在 main_activity.xml 中工作。

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

现在这当然行不通了,我猜这是因为我的 View 和绑定(bind)之间没有明确的联系,但是,上面的 Activity 和绑定(bind)之间也没有联系,所以为什么那有用吗?

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

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

最佳答案

您可以将动态扩展的数据绑定(bind) View 添加到 LinearLayout。您必须以编程方式为数据绑定(bind) View 设置数据。

void addViewToViewGroup(ViewGroup viewGroup, User user) {
  LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
  MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, viewGroup,true);
  binding.setUser(user);
}

如果您附加了一个已知的绑定(bind),您可以改为从那里提取数据。在这里,我假设包含的 ViewGroup 在布局 outer.xml 中并生成了绑定(bind) 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 的用户之间没有直接绑定(bind)。这意味着如果您更新它,您将看不到它的反射(reflect)。使用包含的布局,框架确实可以绑定(bind)您必须手动执行的操作。要获取动态更新,您可以这样做:

outer.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
   @Override
   public void onPropertyChanged(Observable sender, int propertyId) {
       if (propertyId == BR.user) {
           binding.setUser(outer.getUser());
           break;
       }
   }
});

关于以编程方式添加到 LinearLayout 的单个 View 上的 Android 数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634706/

相关文章:

c# - 在解析期间设置命名空间

html - 使用CSS垂直居中按钮

java - 如何将启动器主屏幕添加到我的应用程序?

android - 如何从路由器获取所有错误信息并在应用程序中显示

android - 如何在 Android 中刷新 ListView

android - 如何在Android中无间隙播放声音循环

android - 在react native apk指令中找不到gradle.properties文件

c# - 无法在 C# 中序列化数组对象

xml - android包含标签 - 无效的布局引用

java - GXT 3 布局容器 : Horizontal & Vertical vs HBox & VBox