Как управлять ListView с шаблоном MVP для Android

В настоящее время я разрабатываю приложение для Android с использованием шаблона MVP.

Когда я пытаюсь разработать Activity, я должен использовать ListView. Поэтому я использую Adapter для ListView. Но я слышал, что Adapter похож на Presenter на MVP Pattern.

Я думаю, если Apdater будет знаком с Presenter, тогда я должен сделать Presenter для обновления ListView вместо Adapter.

Когда эта ситуация, как разработать ListView? Просто используйте Adapter и продолжайте использовать шаблон MVP?

Спасибо за ваше чтение.

Solutions Collecting From Web of "Как управлять ListView с шаблоном MVP для Android"

Да, адаптер должен быть компонентом P в шаблоне MVP. Фактически ListViews в значительной степени написаны как MVP – функция getView () должна устанавливать все значения вида каждый раз при вызове, это почти определение того, что должен делать ведущий. Хотя это также легко использовать в способе типа MVC – просто есть функции вызова getView в представлении, которые передают ему модель и выполняют эту работу в представлениях. Так что в любом случае все будет работать, просто выберите свое предпочтение.

Если вы используете модель MVP со сложными строками списка, мне нравится делать строки настраиваемым составным представлением и помещать на нем более описательные имена функций, а не переходить в listRow.findViewById (R.id.textView) .setText (filename) Я перейду listRow.setFilename (имя файла), и пусть представление узнает, что с этим делать. Такого рода размывает границы MVP и MVC немного, но я нахожу, что это хороший баланс читаемости вашего адаптера и избежание некоторой неловкости, которую иногда приносит MVC.

Адаптер является частью представления. Фактически, все зависимости от Android должны быть частью представления. Чтобы адаптер был изолирован от вашей модели, а ваш презентатор – сложной задачей. Для этой цели я выпустил библиотеку под названием PaperKnife.

Вы можете использовать PaperKnife для отсоединения адаптера от модели и уровня презентатора. Следуйте следующим шагам:

  1. Аннотация модельного слоя с использованием интерфейса CellElement . Ваш уровень просмотра не обязательно должен знать вашу модель.

  2. Создайте класс, чтобы предоставить информацию для вашего представления строки. Вы можете использовать своего ведущего. Внедряет класс CellDataProvider и создает методы для предоставления всей информации. Аннотируйте свои методы провайдера с помощью @DataSource("DataId") для выполнения сопоставления. Ваши методы данных получают экземпляр вашего класса модели. Например:

     public class SamplePresenterImpl implements SamplePresenter, CellDataProvider { @DataSource("Title") public String getTitle(Item item) { return item.getTitle(); } // etc. } 
  3. Создайте ViewHolder в своем адаптере и CellViewHolder интерфейс CellViewHolder . Создайте методы управления представлениями и используйте DataTarget("DataId")

     static class ViewHolder extends CellViewHolder { @DataTarget("Title") public String setTitle(String title) { mTextViewTitle.setText(title); } } 
  4. Выполните отображение в вашем адаптере getView :

     @Override public View getView(int position, View convertView, ViewGroup parent) { // etc. PaperKnife.map(mList.get(position)) .dataProvider(mCellDataProvider) .into(viewHolder); return convertView; } 

Таким образом, ваш уровень представления просто знает интерфейс CellElement , и ваш ведущий несет ответственность за предоставление данных вашему адаптеру.

Если в этом действии есть только список, тогда нет необходимости писать отдельный презентатор, потому что Adapter фактически работает как Presenter для ListView. Но если у вас есть другие компоненты пользовательского интерфейса, чем ListView, которые необходимо обновить, вам нужно будет написать отдельный презентатор для этих компонентов пользовательского интерфейса.

Приложения Android в основном построены вокруг Model-View-Controller (MVC) – MVP звучит как одно и то же, хотя я и не слышал этого термина раньше. Действия заполняют роль Контроллера, XML-представления – это просто (хотя вы можете их программно создавать в Activity – проще и проще сделать это в XML) и Model, которую вы пишете сами. Так что да, эта модель вполне практична.

Возможная причина, по которой вы, возможно, не слышали много об этой модели дизайна, заключается в том, что фреймворк Android заставляет вас отделить представление. Поскольку приложение на мобильных устройствах имеет тенденцию быть небольшим, люди не склонны использовать полнофункциональный MVC; Они имеют тенденцию к представлению и уровням действия, где слой действия выполняет большую часть работы (небольшой) модели.

Если вы пишете кросс-платформенное приложение, вам может потребоваться четырехуровневый подход: просмотр, действие, бизнес-логика и модель. Уровни представления и действия будут специфичными для платформы, тогда как бизнес-логика и модель не изменятся. В принципе, вы разделяете презентацию и взаимодействие пользователя с уровнем Action, который вызывает уровень Business Logic для выполнения действий, которые пользователь хочет.