首页 > 解决方案 > 在 MVVM 中显示对话框、布局和数据过滤

问题描述

我从 MVVM 架构开始我的冒险,遇到了几种我找不到明确答案的情况。

  1. 显示例如 AlertDialog。我目前正在显示活动(视图)中的 AlertDialog,因为 ViewModel 不应包含对视图的任何引用。这是正确的机制吗?

  2. 最近,我正在制作一个应用程序,其中我从数据库中获取所有任务。任务分为 3 个类别,我需要将每个类别的任务放在单独的列表中。我在活动(视图)中按以下方式进行操作:

    viewModelMainActivity = new ViewModelProvider(this).get(ViewModelMainActivity.class);
    viewModelMainActivity.getAllTasks().observe(this, new Observer<List<Task>>() {
        @Override
        public void onChanged(List<Task> tasks) {
    
            List<Task> allJobTasks = new ArrayList<>();
            List<Task> allShoppingTasks = new ArrayList<>();
            List<Task> allOtherTasks = new ArrayList<>();
    
            for(int i = 0; i < tasks.size(); i ++) {
    
                String category = tasks.get(i).getCategory();
    
                switch (category) {
                    case JOB_CATEGORY:
                        allJobTasks.add(tasks.get(i));
                        break;
    
                    case SHOPPING_CATEGORY:
                        allShoppingTasks.add(tasks.get(i));
                        break;
    
                    case OTHER_CATEGORY:
                        allOtherTasks.add(tasks.get(i));
                        break;
    
                }
            }
    
            taskAdapter.setAllJobTasks(allJobTasks);
            taskAdapter.setAllShoppingTasks(allShoppingTasks);
            taskAdapter.setAllOtherTasks(allOtherTasks);
    
            showOrHideImageAndText(allJobTasks, JOB_CATEGORY);
            showOrHideImageAndText(allShoppingTasks, SHOPPING_CATEGORY);
            showOrHideImageAndText(allOtherTasks, OTHER_CATEGORY);
    
            taskAdapter.setCurrentTasks(currentCategory);
    
        }
    });
    

这是正确的方法吗?我不这么认为,但我还能如何按类别过滤数据?

标签: javaandroidmvvm

解决方案


回答这两个问题

1.-您在活动中执行此操作是正确的,因为否则您必须将活动引用发送到视图模型

2.-正如我可以在您的代码中假设的那样,您稍后会使用这些列表来填充视图,正确的做法是在将响应返回到活动之前填充视图模型中的列表,但不是这样作为信息管理的繁重逻辑我认为它不是 100% 必要的,所以可以在活动中这样做


推荐阅读