有没有办法观察 Arraylist 的大小,因为它通过数据绑定发生变化?
Is there a way to observe an Arraylist's size as it changes via databinding?
基本上我的 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 的大小?
更新:
我的 SubredditAddition class 现在使用 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());
}
}
我的片段有以下代码来更新关键字:
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}">
但是,当我在 Fragment 中通过 saveKeyword()
方法添加关键字后,我的 UI 仍然没有更新。我该如何解决这个问题?
是的。 ArrayList 本身是不可观察的。要么你想将更改推送到你的注册表onec你 added/removed 项,或者你使用 ObservableArrayList
代替。
它的行为类似于 ArrayList,您可以使用 get()
和 set()
public class SubredditAddition {
public final ObservableList<Keyword> mKeywords = new ObservableArrayList<>();
}
如果您不提供 getter 和 setter,请将其设为 public
。
即使上述解决方案可能有效,也不推荐这样做,因为如果更新列表中的项目而不是列表本身,它不会更新。
更好的解决方案是创建一个 ObservableInt 或 ObservableBoolean 并更新此列表 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}"
基本上我的 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 的大小?
更新:
我的 SubredditAddition class 现在使用 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());
}
}
我的片段有以下代码来更新关键字:
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}">
但是,当我在 Fragment 中通过 saveKeyword()
方法添加关键字后,我的 UI 仍然没有更新。我该如何解决这个问题?
是的。 ArrayList 本身是不可观察的。要么你想将更改推送到你的注册表onec你 added/removed 项,或者你使用 ObservableArrayList
代替。
它的行为类似于 ArrayList,您可以使用 get()
和 set()
public class SubredditAddition {
public final ObservableList<Keyword> mKeywords = new ObservableArrayList<>();
}
如果您不提供 getter 和 setter,请将其设为 public
。
即使上述解决方案可能有效,也不推荐这样做,因为如果更新列表中的项目而不是列表本身,它不会更新。
更好的解决方案是创建一个 ObservableInt 或 ObservableBoolean 并更新此列表 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}"