【问题标题】:View model not updating UI视图模型不更新 UI
【发布时间】:2018-04-16 05:16:22
【问题描述】:

我有以下课程

PostsViewModel.java

......
//Boolean observable to toggle the visibility of progress bar
public static final ObservableBoolean postsLoading = new ObservableBoolean(false);

private void getPosts() {
    postsLoading.set(true);
    getPostRepository().getPosts(new PostDataSource.LoadPostCallback() {
        @Override
        public void onPostsLoaded(List<Post> posts) {
            boolean isEmpty = posts == null || posts.isEmpty();

            //setting the post loading false here
            postsLoading.set(false);

            Log.d(TAG, "onPostsLoaded: posts loading set to false");
            if (!isEmpty) {
                mPostObservable.clear();
                mPostObservable.addAll(posts);
            }
            errorViewShowing.set(isEmpty);

        }

        @Override
        public void onDataNotAvailable(String message) {
            postsLoading.set(false);
            errorViewShowing.set(true);
            errorString.set(message);
        }
    });
}
......

活动后

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PostList binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    PostsViewModel mPostsViewModel = new PostsViewModel();
    binding.setPostViewModel(mPostsViewModel);
    mPostsViewModel.getPosts(); //calling get posts here
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data class="PostList">

    <import type="android.view.View" />

    <variable
        name="postViewModel"
        type="com.example.vuclip.mvvm_repository.posts.PostsViewModel" />
</data>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".posts.PostsActivity">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="@{ postViewModel.postsLoading ? View.VISIBLE : View.GONE }" />

</RelativeLayout>
</layout>

我想根据PostsViewModel 中的postsLoading ObservableBoolean 变量的值来切换进度条的可见性。我使用调试器检查并确认我的代码确实将postsLoading 变量的值设置为false,但进度条仍然可见。

看起来 Observable 字段中的更改由于某种原因没有通知到布局文件。我这里出了什么问题?

我在我的 gradle 文件中启用了 dataBinding。

【问题讨论】:

  • 我是否必须调用一些方法来通知更改,我知道我们必须调用 notifyChange() 以防 Bindable 字段但 BaseObservable 类也需要它?
  • 您是否尝试在生成的代码中找到setVisibility 并在那里设置断点?
  • 还没有,不知道该怎么做。让我试试
  • 不,使用Observable[&lt;PrimitiveType&gt;]s 时不需要 - 请参阅android.googlesource.com/platform/frameworks/data-binding/+/…
  • 我找不到可见性切换生成的代码。 :(

标签: android mvvm data-binding


【解决方案1】:

问题是我的 Observable 字段是静态的。我真的不知道为什么会这样,但是一旦我删除了静态字段,它就开始工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2013-05-26
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2013-12-02
    相关资源
    最近更新 更多