相关疑难解决方法(0)

为什么要为新连接的观察者触发两次LiveData观察者

我的理解LiveData是,它将触发观察者对当前状态变化的数据,而不是一系列历史状态变化的数据.

目前,我有一个MainFragment执行Room写操作的程序,用于将非删除数据更改为已删除的数据.

我也是另一个TrashFragment观察到破坏数据的人.

请考虑以下情形.

  1. 目前有0个已删除的数据.
  2. MainFragment是当前活动的片段.TrashFragment尚未创建.
  3. MainFragment添加了1个已删除的数据.
  4. 现在,有1个已删除的数据
  5. 我们采用抽屉式导航来代替MainFragmentTrashFragment.
  6. TrashFragment的观察者将首先收到onChanged0个已删除的数据
  7. 再次,TrashFragment观察者将接下来接收onChanged1个已删除的数据

我的期望是,第(6)项不应该发生.TrashFragment应该只接收最新的已删除数据,即1.

这是我的代码


TrashFragment.java

public class TrashFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        noteViewModel = ViewModelProviders.of(getActivity()).get(NoteViewModel.class);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-architecture-components

41
推荐指数
9
解决办法
3万
查看次数

如何使用livedata进行数据绑定?

如何使用livedata进行数据绑定?

activity_user_detail.xml:

<data>
    <variable
        name="viewModel"
        type="com.test.viewmodel.UserViewModel" />
</data>
<TextView
        android:id="@+id/tv_amount"
        android:layout_width="match_parent"
        android:text="@{viewModel.age}"
 ....
Run Code Online (Sandbox Code Playgroud)

UserViewModel.java:

public class UserViewModel extends ViewModel {
    public LiveData<User> user;
    public void getUserById(UserDao userDao, String userId){
        transaction = UserDao .load(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

UserDao.java:

@Query("SELECT * FROM `user` WHERE id = :userId")
LiveData<User> load(String userId);
Run Code Online (Sandbox Code Playgroud)

UserDetailActivity.java:

private ActivityUserDetailBinding binding;
binding = DataBindingUtil.setContentView(this, R.layout.activity_user_detail);
viewModel = ViewModelProviders.of(this).get(UserViewModel.class);
viewModel.getUserById(userDao, userId);
viewModel.user.observe(this, user -> binding.setViewModel(user)); // How to bind livedata?
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个:

binding.setViewModel(viewModel);
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-room android-livedata

6
推荐指数
1
解决办法
4217
查看次数

viewmodel在屏幕方向上进行网络调用更改android

我是android体系结构组件的新手,我对它一点也不困惑viewmodel。我正在构建一个从服务器获取项目列表并在布局中显示为列表的应用程序。我已经在Repository课堂上实现了网络通话。

Repository.java:

//Get list of top rated movies
    public LiveData<NetworkResponse> getTopRatedMovies() {
        final MutableLiveData<NetworkResponse> result = new MutableLiveData<>();
        ApiService api = retrofit.create(ApiService.class);
        Call<MovieData> call = api.getTopRateMovies("api_key");
        call.enqueue(new Callback<MovieData>() {
            @Override
            public void onResponse(Call<MovieData> call, Response<MovieData> response) {
                result.postValue(new NetworkResponse(response.body()));
            }

            @Override
            public void onFailure(Call<MovieData> call, Throwable t) {
                Log.e(TAG, t.getLocalizedMessage());
                result.postValue(new NetworkResponse(t));
            }
        });
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

现在在ViewModel课堂上我正在这样做:

public class MovieListViewModel extends ViewModel {


    public LiveData<NetworkResponse> result, topRatedMovies;
    public LiveData<List<MovieEntity>> favoriteMovies;

    private Repository repository; …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-viewmodel android-architecture-components android-jetpack

2
推荐指数
1
解决办法
1865
查看次数