2016-08-15 50 views
1

當前我正在開發一個android應用程序,併爲我的gui使用數據綁定。Android中充氣佈局的數據綁定不刷新

我的問題是,我想要顯示的數據不會自動刷新。

我認爲我的問題的根源是我膨脹多個子視圖到我的根視圖。我的看法層次結構看起來是這樣的:

  • 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(); 
    } 

當沒有處理數據,該視圖是不可見的,並且當我在運行期間接收的過程數據的角度的自動可見。

但現在我想膨脹另一個xml文件的value_x_view。我膨脹這樣的:

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); 
} 

*參數「視圖」是父片段佈局

我膨脹約12 value_views當運行applikation內的LinearLayout並且它們被正確顯示。唯一的問題是他們沒有得到刷新。他們只顯示value_view被誇大時有效的值。

有沒有辦法讓數據綁定工作。我錯過了什麼,或者我做錯了什麼?

+0

不知道你的數據綁定,但嘗試getActivity()getLayoutInflater()而不是getLayoutInflater(空) –

+0

我試過了,但現在我的value_views沒得到了充氣 – Tir

+0

對不起,他們確實正在膨脹。但數值仍然不令人耳目一新 – Tir

回答

5

這段代碼:

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,我認爲你不想這樣做。

也許您更喜歡在您的佈局中使用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()); 
      } 
     } 
    } 
} 
+0

嗨喬治,感謝您的答案! 我膨脹的佈局和設置綁定值的部分是故意的,因爲我想只設置一次,讓數據綁定更新我的GUI。我認爲這是數據綁定的目的。如果我錯了,請糾正我。 我試圖實現綁定偵聽器。當我調試applikation我注意到onPropertyChanged()方法永遠不會被調用。也許我有一個notifyPropertyChange d()調用的問題。我會仔細研究一下。 – Tir

+0

我發現我的問題。在運行期間,我銷燬了對綁定到佈局的對象的引用。現在我只是照顧我以適當的方式刷新我的數據對象,它的工作原理。另一種可能是重新綁定我刷新的對象,在這種情況下,我將不得不小心再次膨脹佈局(如喬治所述) – Tir