2017-06-03 50 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场景是解耦通信到其他的聆听意见特别有用。

例如在同一活动中的另一个片段