2017-06-03 52 views
0

閱讀Google docs我發現(有點)使用selectedItem爲了向其他觀察者傳播正在觸發的事件的示例,這是我當前的實現:MVVM // ViewModel事件正在觸發活動循環(已創建)

視圖模型

public void onListItemClicked(Item item) { 
    if (selectedItem.getValue() == item) { 
     return; 
    } 
    selectedItem.postValue(item); 
} 


public LiveData<Item> getSelectedItem() { 
    if (selectedItem == null) { 
     selectedItem = new MutableLiveData<>(); 
    } 

    return selectedItem; 

} 

查看

ListViewModel viewModel = ViewModelProviders.of(this).get(ListViewModel.class); 

viewModel.getSelectedItem().observe(this, new Observer<Item>() { 
    @Override 
    public void onChanged(@Nullable Item item) { 
     if (item != null) { 
      openDetailActivity(item); 
     } 
    } 
}); 

當用戶點擊列表:

@Override 
public void onItemClicked(Item item) { 
    viewModel.onListItemClicked(item); 
} 

所有好和所有它的工作原理,當用戶旋轉屏幕ListActivity重新產生的問題是檢測到變化,訂閱時將打開DetailActivity

我發現了一個解決方法,在getSelectedItem()上增加了selectedItem.postValue(null);,但它有點冒險。

Ofc人可能會爭辯說,開放的細節活動和宣傳甚至應該是分開的,但我想知道如果有人有更好的實施/建議。

回答

0

因此經過相當多的研究並與Google開發人員取得了聯繫。建議的解決方案是分別承擔責任。

開幕活動應click事件,而不是實際變化的響應,這種類型的selectedItem場景是解耦通信到其他的聆聽意見特別有用。

例如在同一活動中的另一個片段