
Java
MVP/MVVM - 列表过滤,谁负责?
在软件开发中,列表过滤是一个常见的需求。当我们需要根据特定条件筛选和显示列表中的项时,我们需要一个机制来处理这个过程。在MVP (Model-View-Presenter) 和MVVM (Model-View-ViewModel) 这两种架构模式中,都有不同的方式来处理列表过滤。但是,问题是,到底是谁负责处理列表过滤?让我们来探讨一下。MVP 中的列表过滤在MVP 架构中,列表过滤通常由Presenter负责处理。Presenter是连接Model和View的中间人,它负责处理用户的交互和业务逻辑。当用户在View上进行列表过滤时,View会将这个请求传递给Presenter,然后Presenter会根据过滤条件从Model中获取符合条件的数据,并将结果传递回View进行显示。下面是一个简单的MVP架构中的列表过滤的示例代码:Java// Modelpublic class DataModel { private List<String> dataList; public DataModel() { dataList = new ArrayList<>(); dataList.add("Apple"); dataList.add("Banana"); dataList.add("Orange"); dataList.add("Grapes"); } public List<String> getDataList() { return dataList; }}// Viewpublic interface DataView { void showDataList(List<String> dataList);}// Presenterpublic class DataPresenter { private DataView view; private DataModel model; public DataPresenter(DataView view) { this.view = view; model = new DataModel(); } public void filterDataList(String keyword) { List<String> filteredList = new ArrayList<>(); List<String> dataList = model.getDataList(); for (String data : dataList) { if (data.toLowerCase().contAIns(keyword.toLowerCase())) { filteredList.add(data); } } view.showDataList(filteredList); }}// Usagepublic class MAIn { public static void mAIn(String[] args) { DataView view = new DataView() { @Override public void showDataList(List<String> dataList) { for (String data : dataList) { System.out.println(data); } } }; DataPresenter presenter = new DataPresenter(view); presenter.filterDataList("a"); }}在上面的示例中,当用户输入过滤的关键字时,View会调用Presenter的filterDataList方法,并将关键字作为参数传递给Presenter。然后Presenter会根据关键字过滤Model中的数据,并将结果通过View的showDataList方法显示出来。这样,MVP架构中的列表过滤就完成了。MVVM 中的列表过滤与MVP不同,MVVM架构中的列表过滤通常由ViewModel负责处理。ViewModel是连接View和Model的中间人,它负责处理用户的交互和数据操作。当用户在View上进行列表过滤时,View会将过滤条件传递给ViewModel,然后ViewModel会根据过滤条件从Model中获取符合条件的数据,并将结果通过数据绑定机制传递给View进行显示。下面是一个简单的MVVM架构中的列表过滤的示例代码:Java// Modelpublic class DataModel { private List<String> dataList; public DataModel() { dataList = new ArrayList<>(); dataList.add("Apple"); dataList.add("Banana"); dataList.add("Orange"); dataList.add("Grapes"); } public List<String> getDataList() { return dataList; }}// ViewModelpublic class DataViewModel { private DataModel model; private MutableLiveData<List<String>> filteredDataList; public DataViewModel() { model = new DataModel(); filteredDataList = new MutableLiveData<>(); } public LiveData<List<String>> getFilteredDataList() { return filteredDataList; } public void filterDataList(String keyword) { List<String> filteredList = new ArrayList<>(); List<String> dataList = model.getDataList(); for (String data : dataList) { if (data.toLowerCase().contAIns(keyword.toLowerCase())) { filteredList.add(data); } } filteredDataList.setValue(filteredList); }}// Viewpublic class DataViewActivity extends AppCompatActivity { private DataViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setcontentView(R.layout.activity_data_view); viewModel = new ViewModelProvider(this).get(DataViewModel.class); EditText filterEditText = findViewById(R.id.filterEditText); RecyclerView dataRecyclerView = findViewById(R.id.dataRecyclerView); // 设置RecyclerView的Adapter和LayoutManager filterEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { viewModel.filterDataList(s.toString()); } @Override public void afterTextChanged(Editable s) { } }); viewModel.getFilteredDataList().observe(this, new Observer<List<String>>() { @Override public void onChanged(List<String> dataList) { // 更新RecyclerView的数据 } }); }}在上面的示例中,当用户输入过滤的关键字时,View会将关键字传递给ViewModel的filterDataList方法。然后ViewModel会根据关键字过滤Model中的数据,并通过filteredDataList的setValue方法更新数据。View通过观察(filteredDataList)来自动更新显示的列表。无论是MVP还是MVVM架构,列表过滤都是一个常见的需求。在MVP中,列表过滤由Presenter负责处理,而在MVVM中,列表过滤由ViewModel负责处理。MVP和MVVM都提供了一种可靠的方法来处理列表过滤,具体的选择取决于个人或团队的偏好和项目的需求。无论选择哪种架构,列表过滤都可以通过合适的设计模式和数据绑定机制来实现。希望本文对您理解MVP和MVVM架构中的列表过滤有所帮助,并提供了一些示例代码来展示如何处理这一需求。无论您选择哪种架构,重要的是保持代码的清晰、可维护和可扩展性。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号