Size: a a a

Android Architecture

2020 January 27

C

Chernikov in Android Architecture
Denis Egorov
ViewHolder должен уметь просто представить данные (готовые данные) в удобной пользователю форме. Адаптер тоже должен получать уже готовые данные. Если нужно, то ViewHolder может кинуть эвент, что на него где-то нажали. Этот эвент ты можешь обработать, где хочешь. По факту api у твоего списка должно быть такое: myAdapter.updateData(data). Если приходится накручивать какую-то сложную логику, то надо делать это со стороны. Инкапсулируй свой список в какой-нибудь контроллер и используй его. Но делать презентер для каждого вью холдера - это жестко. Хотя мб я чего-то не понимаюю
Ну у нас кстати так сделано, в OnBindViewHolder создается типа презентера класс которому сообщается модель с данными по номеру position, и в этом презенторе уже реализуется логика чтения нажатия например, отображения и т.д.
источник

C

Chernikov in Android Architecture
то есть сколько айтемов рециклятся столько презентеров и создается
источник

AD

Aleksey D. in Android Architecture
Chernikov
Ну у нас кстати так сделано, в OnBindViewHolder создается типа презентера класс которому сообщается модель с данными по номеру position, и в этом презенторе уже реализуется логика чтения нажатия например, отображения и т.д.
не лагает скролл?
источник

IM

Ihor Martyniuk in Android Architecture
Denis Egorov
ViewHolder должен уметь просто представить данные (готовые данные) в удобной пользователю форме. Адаптер тоже должен получать уже готовые данные. Если нужно, то ViewHolder может кинуть эвент, что на него где-то нажали. Этот эвент ты можешь обработать, где хочешь. По факту api у твоего списка должно быть такое: myAdapter.updateData(data). Если приходится накручивать какую-то сложную логику, то надо делать это со стороны. Инкапсулируй свой список в какой-нибудь контроллер и используй его. Но делать презентер для каждого вью холдера - это жестко. Хотя мб я чего-то не понимаюю
Адаптер должен преобразовывать данные одного вида в данные другого вида согласно паттерну.
Дроидовский адаптер впринципе выполняет эту задачу. Он преобразовует из списка неких объектов в список viewholder-ов, которые в свою очередь отдает AdapterView, когда она его просит.

Но тут получается проблема. Вью-холдер - это по сути вьюшка. Он отображает данные и делегирует действия пользователя  классу, ответственному за управление(согласно шаблону, который вы используете).
И тут становится вопрос: а что собственно является таким классом для холдера? Адаптер?  И куда этот адаптер ложить? В презентер, или во вью? Он вроде как занимается рендерингом айтемов. Так что по-идее вью. Но он же вроде как анализирует список. Так что по идее презентер. И вот куда его?

Я тут вижу два логичных  варианта:
1. Инкапсулировать адаптер во вью. Это вроде проще. Но тогда этот... эм... модуль нагружается логикой по типу: обнови состояние такое-то на  айтеме в позиции N. И по факту выходит , что вью А(фрагмент) управляет вью Б(вью-холдер), что нагружает ее и делает на мой взгяд слишком умной для вью.
2. То, что я собсно предложил. Тогда вью презентер MyListView подписуется на "получен новый итем", "итем удален" и ... собственно все. А управлением каждым холдером , занимается отдельный презентер(ну или что у вас там). Тогда адаптер, как тулза для рендеринга становится вполне логичной частью вью без компромиссов.

Я видел третий вариант, когда адаптер принимают за отельный вью. По мне так это странный вариант, но имеет право на жизнь впринципе.

Важно понимать, что я не пытаюсь сказать: "вот так правильно".  Это скорее что-то вроде: "можно вот так сделать. Вроде норм получается"
источник

IM

Ihor Martyniuk in Android Architecture
Aleksey D.
не лагает скролл?
я тестил. На бюджетном сяоми начинает лагать к 4 тысячам айтемов.
метстами помнится были подтормаживания в начале скролла. Но я уже не помню, было ли это связано с такой организацией и где там вообще собака порылась
источник

AA

Andrey Akimov in Android Architecture
а такой вопрос. Как правильно обрабатывать клики в recycler? Правильно ли будет пробросить в адаптер презентер, в качестве слушателя?
источник

AD

Aleksey D. in Android Architecture
Andrey Akimov
а такой вопрос. Как правильно обрабатывать клики в recycler? Правильно ли будет пробросить в адаптер презентер, в качестве слушателя?
интерфейс же
источник

AA

Andrey Akimov in Android Architecture
Aleksey D.
интерфейс же
это не очевидно?)
источник

AD

Aleksey D. in Android Architecture
Andrey Akimov
это не очевидно?)
раз спрашиваешь - нет
источник

AA

Andrey Akimov in Android Architecture
Aleksey D.
раз спрашиваешь - нет
ну имел ввиду интерфейс, конечно же
источник

AD

Aleksey D. in Android Architecture
Andrey Akimov
ну имел ввиду интерфейс, конечно же
а презентер тогда зачем, если интерфейс для покликух?
источник

AA

Andrey Akimov in Android Architecture
Aleksey D.
а презентер тогда зачем, если интерфейс для покликух?
имелось ввиду, что этот интерфейс реализует презентер
источник

AA

Andrey Akimov in Android Architecture
Aleksey D.
а презентер тогда зачем, если интерфейс для покликух?
ну я в целом неправильно выразился, да
источник

AD

Aleksey D. in Android Architecture
Andrey Akimov
имелось ввиду, что этот интерфейс реализует презентер
да норм, у них ж жц один
источник

IM

Ihor Martyniuk in Android Architecture
Andrey Akimov
а такой вопрос. Как правильно обрабатывать клики в recycler? Правильно ли будет пробросить в адаптер презентер, в качестве слушателя?
Ну это такой же вопрос, как "можно ли имплементить презентере(контроллере, вью модели) OnClickListener.
C точки зрения SOLID не стоит. Потому, как сегодня у вас действие юзера триггерится нажатием на кнопку. А завтра дизайнер передумал, и вам нужно отлавливать свайп некой вьюшки вправо. Принцип лисков говорит о том, что изминений в презентере в такой ситуации происходить не должно. Если вы дергаете метод "OnUserActionTriggered()" на презентере - принцип выдерживается. Если презентер имплементит onClickListener - нет.

Но впринципе, если вы так сделаете - беды не случится. Не думаю, что это будет серьезной проблемой, если вы понимаете, что , зачем и почему делаете.
источник

AD

Aleksey D. in Android Architecture
я вообще для себя придумал, что в презентере для списка есть метод onEventTriggered(Any) и кайфую
источник

C

Chernikov in Android Architecture
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
       {
           var cellHolder = holder as TableCollectionViewCellVC;

           if (cellHolder != null)
           {
               var index = GetIndexPathByPosition(position);

               TableCellMC model = ModelController.GetCell(index, cellHolder.ModelController);

               if (cellHolder.ModelController == null)
               {
                   cellHolder.BindWithModel(model);
               }

               cellHolder.InSight = true;
           }
       }
источник

AD

Aleksey D. in Android Architecture
Chernikov
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
       {
           var cellHolder = holder as TableCollectionViewCellVC;

           if (cellHolder != null)
           {
               var index = GetIndexPathByPosition(position);

               TableCellMC model = ModelController.GetCell(index, cellHolder.ModelController);

               if (cellHolder.ModelController == null)
               {
                   cellHolder.BindWithModel(model);
               }

               cellHolder.InSight = true;
           }
       }
это какой-то замарин
источник

C

Chernikov in Android Architecture
Aleksey D.
это какой-то замарин
ну суть одна
источник

AA

Andrey Akimov in Android Architecture
Ihor Martyniuk
Ну это такой же вопрос, как "можно ли имплементить презентере(контроллере, вью модели) OnClickListener.
C точки зрения SOLID не стоит. Потому, как сегодня у вас действие юзера триггерится нажатием на кнопку. А завтра дизайнер передумал, и вам нужно отлавливать свайп некой вьюшки вправо. Принцип лисков говорит о том, что изминений в презентере в такой ситуации происходить не должно. Если вы дергаете метод "OnUserActionTriggered()" на презентере - принцип выдерживается. Если презентер имплементит onClickListener - нет.

Но впринципе, если вы так сделаете - беды не случится. Не думаю, что это будет серьезной проблемой, если вы понимаете, что , зачем и почему делаете.
и как сделать в идеале тогда?
источник