Intereting Posts
Android MIDI Threading InteruptedException – сообщения Aftertouch Низкоуровневый аудио API для Android Android: как программно установить ширину ImageView внутри TableRow КлассNotFoundException dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:61) Разрешение экрана Android Android Studio – ошибка ADB – «… устройство несанкционировано. Проверьте диалоговое окно подтверждения на своем устройстве. " Android: прослушиватель записывает звук, если возникает какой-либо звук Рабочий многоточечный запрос POST с волейболом и без HttpEntity AlarmManager не работает, как ожидалось, в режиме ожидания на S5 Neo Как показать диалог выбора местоположения, например, карты Google? Приложение Android не запрашивает разрешения при установке Android: изменение формата времени в соответствии с форматом текущего времени устройства Как значения Gravity влияют на PopupWindow.showAtLocation () в Android Google Play Staged Rollout с измененными скриншотами Обновите медиаредактор Android, используя adb

Стандарт архитектуры Android MVP для загрузки пользовательского интерфейса с классом модели, имеющим ресурс android

Я следую MVP-архитектуре в своем приложении. Моя HomeActivity содержит скользящую панель со списком со списком, в котором есть переключатель, который при выборе элемента «Раздвижная панель» изменил состояние значка, и я не использую селектор списка.

Я сохраняю модельный класс NavItemData для заполнения ящика навигации и используя класс SlidingPanelItemSelector, который расширяет StateListDrawable, генерирует соответствующий селектор для значка скользящей панели.

В архитектуре MVP у нас есть класс презентатора, который связывается с моделью и генерирует вход для представлений. В моем случае, если я использую презентатор для получения данных для скользящей панели, я вызываю класс из ведущего, что использование контекста Android является хорошим подходом или у нас есть альтернативное решение, строго следующее архитектуре MVP?

В настоящее время я использую класс ViewBinderUtils и вводил его непосредственно в класс активности и получает список данных для панели. Это после Mvp Architcture?

SlidingPanelItemSelector.class

public class SlidingPanelItemSelector extends StateListDrawable { private Context mContext; public SlidingPanelItemSelector(Context mContext){ this.mContext = mContext; } public StateListDrawable getHomeSelector(){ StateListDrawable stateListDrawable = new StateListDrawable(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, mContext.getDrawable(R.drawable.ic_nav_home_active)); stateListDrawable.addState(new int[]{},mContext.getDrawable(R.drawable.ic_nav_home)); }else{ stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, mContext.getResources().getDrawable(R.drawable.ic_nav_home_active)); stateListDrawable.addState(new int[]{},mContext.getResources().getDrawable(R.drawable.ic_nav_home)); } return stateListDrawable; } } 

ViewBinderUtils.class

 public class ViewDataBinderUtils { Context mContext; @Inject public ViewDataBinderUtils(@ActivityContext Context mContext) { this.mContext = mContext; } public List<SlidingPanelData> getListData(String [] titles){ List<SlidingPanelData> items = new ArrayList<>(); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getHomeSelector(),titles[0],true)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[1],false )); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[2],false)); items.add(new SlidingPanelData(true)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoteSelector(),titles[3],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getEquipmentInventorySelector(),titles[4],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getCustomerSelector(),titles[5],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoterSelector(),titles[6],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getSalesProgramsSelector(),titles[7],false)); items.add(new SlidingPanelData( new SlidingPanelItemSelector(mContext).getCreditAppsSelector(),titles[8],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getRetailOffersSelector(),titles[9],false)); items.add(new SlidingPanelData(true)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getPayOffersSelector(),titles[10],true)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getAlertsSelector(),titles[11],true)); items.add(new SlidingPanelData(true)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getTermofUseSelector(),titles[12],false)); items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getLegalInfoSelector(),titles[11],false)); return items; } } 

Solutions Collecting From Web of "Стандарт архитектуры Android MVP для загрузки пользовательского интерфейса с классом модели, имеющим ресурс android"

Ведущий должен быть изолирован от контекста, потому что единственная часть, которая должна знать о контексте, – это часть View (V). Я не очень хорошо понимаю вашу цель с этими классами, но в общем виде вы должны следовать этой логике

Если я использую презентатор для получения данных для Раздвижной панели, я вызываю класс из ведущего, использующего контекст андроида

Создайте интерфейс, который отвечает за управление связью между View (V) и Presenter (P).

Communication.java

 public interface Communication { void showLoading(); void hideLoading(); void setSlidingData(String [] titles); } 

В вашем представлении должен реализовываться этот интерфейс Comunication и есть ссылка для Presenter. И если вам нужно использовать контекст для Interactor (I), у вас должен быть класс, который управляет этим (в моем случае RequestHolder ).

View.java

 public View implements Communication{ private Presenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { // your view already implements the Comunication interface mPresenter = new Presenter(this); } (...) private void getData(){ mPresenter.getData(new RequestHolder(getApplicationContext())); } @Override public void setSlidingData(String [] titles){ List<SlidingPanelData> items = new ArrayList<>(); items.add(new SlidingPanelData(new SlidingPanelItemSelector(getApplicationContext()).getHomeSelector(),titles[0],true)); } } 

В презентаторе есть ссылка для вашего интерфейса

Presenter.java

 private Communication mView; public Presenter(Communication view) { mView = view; } /** event to receive data from the model **/ public void onEvent(GetDataMessage event){ mView.setSlidingData(event.getData()); } public void getData(final RequestHolder holder){ new GetDataInteractor(holder); } 

RequestHolder.java

 // you can put the data important to the interactor public RequestHolder(final Context context, int accountId) { super(context); } //getters and setters 

С этим вы можете получить доступ к контексту внутри вашего интерактора, без понятий микса


В сумме,

  • Просмотр – единственный, который предоставляет контекст
  • View имеет ссылку на докладчика
  • Ведущий «разговаривает» с представлением между интерфейсом

В вашем конкретном случае, почему вы не создаете Список, который нуждается в контексте в вашей части View и заполняет элементы List = new ArrayList <> (); В вашей презентационной части? С этим вы держите все изолированное