【问题标题】:Is there a way to observe an Arraylist's size as it changes via databinding?有没有办法通过数据绑定来观察 Arraylist 的大小?
【发布时间】:2017-09-17 23:22:50
【问题描述】:

基本上,我的 ViewModel 将以下 POJO 保存为 MutableLiveData:

public class SubredditAddition {

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

}

如果mKeyword.size() &gt; 0,我希望视图消失

目前,我认为以下行:

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

但是,更改 mKeywords 数组大小不会影响视图的可见性。如何让视图实时响应 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 视图如下所示:

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

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

【问题讨论】:

    标签: java android data-binding view android-databinding


    【解决方案1】:

    是的。 ArrayList 本身不是 Observable。要么您想将更改推送到您添加/删除项目的注册表中,要么您使用 ObservableArrayList 代替。

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

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

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

    即使上述解决方案可能有效,也不建议这样做,因为如果列表中的项目更新但列表本身没有更新,则它不会更新。

    更好的解决方案是创建一个 ObservableInt 或 ObservableBoolean 并更新这个列表设置器已被调用。

    例子:

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

    【讨论】:

    • 我试过了,但是 UI 仍然没有更新。 SubredditAddition 是否必须扩展 BaseObservable 之类的?
    • ObservableList 通知视图它已更改(调用 set())。确保它是公开的,并且您没有任何 getter/setter。注意:它只通知您的列表添加或删除项目。您是否也想收听关键字的变化?如果是,请更新解决方案的答案
    • 我想在添加或删除项目时通知。现在我做 list.add()。我应该改用 list.set() 吗?
    • 这取决于你使用什么。使用带有注册表或 ObservableList 的 BaseObservable/Observable :-)
    • 请在帖子中查看我的更新,看看我是如何构建我的代码的;即使在使用 observablelist 后它仍然无法正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2021-02-27
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多