java - 有没有办法观察 Arraylist 的大小,因为它通过数据绑定(bind)发生变化?

标签 java android data-binding view android-databinding

基本上我的 ViewModel 将以下 POJO 作为 MutableLiveData:

public class SubredditAddition {

    private final ArrayList<Keyword> mKeywords = new ArrayList<>();

}

如果 mKeyword.size() > 0

,我希望 View 消失

目前,我的 View 中有以下行:

android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.GONE : View.VISIBLE}"

但是,更改 mKeywords 数组大小不会影响 View 的可见性。如何让 View 实时响应 ArrayList 的大小?

更新:

我的 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 View 如下所示:

<RelativeLayout ....
            android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.VISIBLE : View.GONE}">

但是,一旦我在 Fragment 中通过 saveKeyword() 方法添加关键字,我的 UI 仍然没有更新。我该如何解决这个问题?

最佳答案

是的。 ArrayList 本身是不可观察的。您可以在添加/删除项目时将更改推送到注册表,或者改用 ObservableArrayList

它的行为类似于 ArrayList,您可以使用 get()set()

public class SubredditAddition {
    public final ObservableList<Keyword> mKeywords = new ObservableArrayList<>();
}

如果您不提供 getter 和 setter,请将其设置为public

即使上述解决方案可能有效,也不推荐这样做,因为如果列表中的项目更新而不是列表本身,它不会更新。

更好的解决方案是创建一个 ObservableInt 或 ObservableBoolean 并在调用 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}"

关于java - 有没有办法观察 Arraylist 的大小,因为它通过数据绑定(bind)发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269752/

相关文章:

java - RoboBinding:firePropertyChange() 上没有此类属性异常

java - 不同默认字符集中的 String.getBytes()

java - 无法将图形应用于 if 语句

Java jjwt 为 JWT 创建无效 JSON

android - 我无法在我的 Dart 插件中运行单独的测试文件

java - 如何根据android中的图像选择设置图像标题

java - Swing 是否带有 Calendar 和时间字段组件?

android - 认证失败注册错误c2dm

c# - 在 WPF 中创建 UI 设置的正确方法是什么?

c# - 将保存按钮绑定(bind)到 DataTable