【问题标题】:Is it mandatory to use ViewModel and Live Data Classes in MVVM Pattern in Android? Else can we use MVVM pattern without using them?在 Android 的 MVVM 模式中是否必须使用 ViewModel 和实时数据类?否则我们可以在不使用它们的情况下使用 MVVM 模式吗?
【发布时间】:2020-02-25 09:22:25
【问题描述】:

我正在尝试在我现有的项目中实现 MVVM 模式。我对我阅读过的大量开发人员网站和教程感到困惑,但在所有地方都使用了仅与实时数据和视图模型一起使用的 MVVM 模式。不使用 LiveData 和 ViewModel 有没有可能我们可以使用 MVVM 模式

问题1.不使用LiveData和ViewModel我们可以使用MVVM模式android吗?


问题 2。不使用 LiveData 将 ViewModel 扩展到某个类有什么用(例如类 Test 扩展 ViewModel)


我正在做 RecyclerView 分页,每次滚动结束时都会获取一组记录,如下所示


 ProfileListViewModel viewModel =
                ViewModelProviders.of(this).get(ProfileListViewModel.class);


//to get first set of records
   viewModel.getProfileList().observe(this, new Observer<List<Profiles>>() {
            @Override
            public void onChanged(@Nullable List<Profiles> profiles) {
                if (projects != null) {
                    //…
                    profileAdapter.setProfiles(profiles);
                }
            }
        });





//to get second set of records

   viewModel.getRemaningProfileList().observe(this, new Observer<List<Profiles>>() {
            @Override
            public void onChanged(@Nullable List<Profiles> profiles) {
                if (projects != null) {
                    //…
                    profileAdapter.setProfiles(profiles);
                }
            }
        });



问题 3:对于使用 MVVM 的这个功能,我们是否需要像上面一样使用两个方法调用(两个 LiveData 对象)来获取新记录,否则每次有其他选择吗?这让我很困惑。


问题 4:有时我会再次在 SQLite android 中插入一些记录,我会从头开始调用此方法,例如 (viewModel.getProfileList().observe())...之后'

我正在清除当前的 LiveData 并再次设置新记录。是否有任何可能性,比如一旦插入/更新记录,它就会自动刷新数据。

谢谢..

【问题讨论】:

    标签: android mvvm viewmodel android-livedata


    【解决方案1】:

    Ans 1. 您可以在不使用 LiveData 的情况下使用 MVVM 模式,但 ViewModel 是强制性的,因为不使用它,MVVM 将毫无意义。 LiveData 用于观察视图模型内的变量/方法上的活动/片段的变化。

    Ans 2. View Model 用于为Activity/Fragment准备和管理数据。对 API 和其他业务逻辑的调用是用类扩展视图模型编写的。这样做是为了实现代码分离。

    Ans 3. 如果 viewModel.getProfileList() 为您获取记录列表,则无需使用 viewModel.getRemaningProfileList() 来获取相同的数据。每次数据发生变化时,viewModel.getProfileList() 的变化都会被观察和放大。

    Ans 4. 你可以使用Activity/Frament的生命周期方法来自动接收数据。例如,在一个活动中,

    onCreate(){
       ProfileListViewModel viewModel =
                ViewModelProviders.of(this).get(ProfileListViewModel.class);
    
    }
    onStart(){
         getObservedData();
    }
    private void getObservedData(){
    viewModel.getProfileList().observe(this, new Observer<List<Profiles>>() {
            @Override
            public void onChanged(@Nullable List<Profiles> profiles) {
                if (projects != null) {
                    //…
                    profileAdapter.setProfiles(profiles);
                }
            }
        });
    }
    

    【讨论】:

    • 就像说的 MVVM 代表模型 - 视图 - 视图模型
    • 对于您的第三个答案,我有一个疑问..首先我们将获得 30 条记录的集合..在 getProfileList.observe 方法中,我们将接收数据并设置为适配器内的数组列表..现在说适配器arraylist 有 30 条记录,livedata 有 30 条记录,然后第二次调用剩余的 30 条记录,这次实时数据已经有 30 条记录,如果我们将剩余的 30 条记录设置为相同的实时数据..那么 onChange livedata 现在将给出 60 条记录..那么如果我将这 60 条记录设置为适配器内的 arraylist,那么它将是 90 条记录,并且有重复的记录。我们如何避免这种情况。谢谢
    • @TirupatiraoV 为避免数据重复,您必须在适配器中创建一个方法来清除您的列表。每次调用 API 时,在适配器中膨胀数据之前,首先调用 clear 方法,然后设置新数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2023-03-18
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多