基本上我的ViewModel将以下POJO保存为MutableLiveData:
public class SubredditAddition {
private final ArrayList<Keyword> mKeywords = new ArrayList<>();
}
如果mKeyword.size() > 0
目前,我的观点中有以下一行:
android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.GONE : View.VISIBLE}"
但是,对mKeywords数组大小的更改不会影响视图的可见性。如何让视图实时响应ArrayList的大小?
更新
My SubredditAddition类现在使用ObservableArraylist,如下所示:
public class SubredditAddition {
private final ObservableArrayList<Keyword> mKeywords = new ObservableArrayList<>();
}
我的ViewModel看起来像这样,在MutableLiveData中持有SubredditAddition:
public class SubredditSelectionViewModel extends AndroidViewModel {
private MutableLiveData<SubredditAddition> mSubredditAddition = new MutableLiveData<>();
public SubredditSelectionViewModel(Application application) {
super(application);
mSubredditAddition.setValue(new SubredditAddition());
}
}
我的Fragment有以下代码来更新关键字:
public class SubredditSelectionFragment extends Fragment {
private void saveTag(Keyword newKeyword) {
SubredditSelectionViewModel viewModel =
ViewModelProviders.of(this).get(SubredditSelectionViewModel.class);
ObservableArrayList<Keyword> keywords = viewModel.getSubredditAddition().getKeywords();
keywords.add(newKeyword);
}
}
我的XML视图如下所示:
<RelativeLayout ....
android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.VISIBLE : View.GONE}">
但是,一旦我通过片段中的saveKeyword()
方法添加关键字,我的UI仍然无法更新。我该如何解决这个问题?
答案 0 :(得分:3)
是。 ArrayList本身不是Observable。要么将更改添加到注册表中,要么添加/删除项目,要么使用ObservableArrayList
代替。
它的行为类似于ArrayList,您可以使用get()
和set()
public class SubredditAddition {
public final ObservableList<Keyword> mKeywords = new ObservableArrayList<>();
}
如果您不提供吸气剂和制定者,请将其设为public
。
即使上述解决方案可能有效,也不推荐使用,因为如果列表中的项目得到更新而不是列表本身,它将不会更新。
更好的解决方案是创建一个ObservableInt或ObservableBoolean并更新此onec已调用Lists setter。
示例:
ObservableInt listVisibility = new ObservableInt(View.GONE);
public void setListData(List<Keyword> data) {
// update your list
listVisibility.set( data.size() > 0 ? View.VISIBLE : View.GONE);
}
最后在你的布局中:
android:visibility="@{viewModel.listVisibility}"