有没有办法观察Arraylist的大小,因为它通过数据绑定改变?

时间:2017-09-17 23:22:51

标签: java android data-binding view android-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的大小?

更新

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仍然无法更新。我该如何解决这个问题?

1 个答案:

答案 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}"