android中膨胀布局的数据绑定不会刷新

时间:2016-08-15 07:30:06

标签: android data-binding android-databinding

目前我正在为Android开发一个应用程序,并为我的gui使用数据绑定。

我的问题是我要显示的数据没有自动刷新。

我认为我的问题的根源是我将多个子视图扩展到我的根视图中。我的视图层次结构看起来像这样:

  • layout_activity_main
    • fragment_layout_0(此处没有数据绑定)
    • fragment_layout_1(用于显示特定设备详细信息的布局)
      • process_data_view
        • value_0_view
        • value_1_view
        • ...
      • interface_view
      • ...

我对process_data_view和value_x_view使用数据绑定,以便自动刷新视图。如果设备不包含过程数据,则process_data_view应该是不可见的。直到这一点它工作正常,因为设备的数据绑定是在片段的onCreateView方法中设置的。

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater,R.layout.layout_details_new,container,false);
        return binding.getRoot();
    }

当没有过程数据时,视图是不可见的,当我在运行时接收过程数据时,视图将自动可见。

但现在我想为value_x_view充气另一个xml文件。我像这样膨胀它:

private void setValue(View view, int value){
            ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
            valueBinding.setValue(value)
            View valueView = valueBinding.getRoot();
            ((LinearLayout) view).addView(valueView);
}

*参数“view”是父片段布局

中的LinearLayout

当我运行applikation并且它们显示正确时,我膨胀了大约12个value_views。唯一的问题是他们没有得到更新。它们只显示value_view膨胀时有效的值。

有没有办法让数据绑定工作。我错过了什么或我做错了什么?

1 个答案:

答案 0 :(得分:8)

这段代码:

private void setValue(View view, int value){
    ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
    valueBinding.setValue(value)
    View valueView = valueBinding.getRoot();
    ((LinearLayout) view).addView(valueView);
}

有点问题。通货膨胀和价值设定是以同样的方式进行的。这意味着如果你想调整价值,你最终会膨胀并添加一个新视图,我认为你不想这样做。

也许您更愿意在布局中使用ViewStub。然后,当你想要给它充气时,你只需将它设置为可见即可。然后,变量赋值都保持最新,不需要任何努力。

<layout ...>
    <data><variable name="value" type="int"/></data>
    <LinearLayout ...>
        <!-- other layouts -->
        <ViewStub android:id="@+id/lateInflation" app:value="@{value}"/>
    </LinearLayout>
</layout>

您拥有的另一个选项是为绑定添加侦听器,每当值发生更改时,请自行更新膨胀的布局。这是更多的工作:

private void setValue(View view, int value){
    final ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
    valueBinding.setValue(value)
    View valueView = valueBinding.getRoot();
    ((LinearLayout) view).addView(valueView);
    // I don't know what your containing
    final LayoutDetailsNewBinding binding = DataBindingUtil.findBinding(view);
    binding.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable sender, int propertyId) {
            // assume the variable name in LayoutDetailsNewBinding is 'value'
            if (propertyId == BR.value) {
                valueBinding.setValue(binding.getValue());
            }
        }
    }
}