【问题标题】:Android Data Binding on Individual Views Added to LinearLayout Programmatically?以编程方式添加到 LinearLayout 的单个视图上的 Android 数据绑定?
【发布时间】:2016-04-14 21:57:04
【问题描述】:

我能够毫无困难地让“活动范围”的数据绑定工作。但是,当我尝试为特定视图设置绑定时,比如说我以编程方式添加到 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 之间也没有联系,那为什么那行吗?

我正在深入研究源代码以了解绑定在活动上的工作方式,我相信这会有我的答案,但如果其他人能在我花费数小时之前加入,我将不胜感激。 !

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

【问题讨论】:

  • 在 RecyclerView 中使用 Android 数据绑定有一些技巧。看看这个演讲realm.io/news/data-binding-android-boyar-mount——大约 22 分钟后,Yigit 谈到了如何使用 RecyclerView 进行数据绑定。
  • @GeorgeMount 我实际上不想使用 RecyclerView,因为每个列表最多只有 5 个视图,所以不需要做很多回收......无论如何,我确实切换到了适当的 RecyclerViews使用 LinearLayout 并将视图单独添加到其中。这很容易,额外的开销可能值得直接的方法。

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


【解决方案1】:

您可以将动态膨胀的数据绑定视图添加到 LinearLayout。您必须以编程方式为数据绑定视图设置数据。

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

如果您要附加一个已知的 Binding,则可以改为从那里提取数据。在这里,我假设包含 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;
       }
   }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多