2016-04-14 42 views
4

我能夠在沒有任何困難的情況下使「整個活動範圍」的數據綁定工作。然而,當我嘗試爲特定視圖設置綁定時,例如說我以編程方式將其添加到LinearLayout的誇大的視圖,我嘗試過的任何東西都不起作用。以編程方式添加到LinearLayout的各個視圖上的Android數據綁定?

例如,將數據綁定到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使用的文檔,並試圖在我充氣的Views中使用這種方法。我通過爲每個ViewHolder創建了一個ListItemBinding(我的.xml被稱爲list_item.xml,這個文件是自動生成的.xml佈局),ListItemBinding被傳遞給ViewHolder作爲參考每個ViewHolder的構造函數。

當然這不起作用,我猜測這是因爲我的視圖和綁定之間沒有明確的聯繫,但是,上面的Activity和Binding之間沒有聯繫,所以爲什麼那樣有用嗎?我正在深入研究源代碼,以瞭解綁定如何工作在活動上,我相信這將會得到我的答案,但如果其他人在我花費多個小時之前可以響個不停,我將不勝感激,開始!

我會在這裏報告所有的發現,非常感謝你

+0

有一些技巧使用Android數據綁定與RecyclerView。看看這個談話https://realm.io/news/data-binding-android-boyar-mount/ - 約22分鐘,Yigit談到如何使用RecyclerView的數據綁定。 –

+0

@GeorgeMount我實際上並不想使用RecyclerView,因爲每個列表最多隻有5個視圖,所以沒有很多回收工作要做......無論如何,我確實使用LinearLayout切換到適當的RecyclerViews並添加視圖單獨給它。這很容易,額外的開銷可能是值得直接的方法。 – AutoM8R

回答

9

您可以添加綁定意見到的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; 
     } 
    } 
}); 
相關問題