#android #mvvm #knockout.js #android-databinding
#Android #mvvm #knockout.js #android-привязка данных
Вопрос:
Большинство популярных MVVM-фреймворков допускают какие-то циклы для свойств типа списка. Например, Knockout имеет привязку foreach. Это позволяет вам перебирать элементы свойства list, и для каждого элемента дублируется разметка, содержащаяся в цикле foreach. Внутри копии текущий элемент используется в качестве контекста для привязки данных.
Я искал что-то подобное в Android, но я видел только возможность привязать список к определенному элементу пользовательского интерфейса. Но это плохо с точки зрения декларативности, потому что мне нужно создать элемент пользовательского интерфейса в коде.
Есть ли способ имитировать что-то подобное, используя функции привязки данных из Android? Если нет, есть ли обходной путь? Или способ расширить синтаксис привязки?
Ответ №1:
Как ответил @tynn, такой API недоступен.
Для достижения того же результата вы можете настроить адаптер для RecyclerView в самом XML. Я реализовал эту функцию в своей библиотеке MVVM. Смотрите раздел Настройка RecyclerView из самого XML.
Ваш XML будет выглядеть следующим образом:
<android.support.v7.widget.RecyclerView
bind:items="@{vm.itemVms}"
bind:layout_vertical="@{true}"
bind:view_provider="@{@layout/row_item}" />
<!-- Same arguments for ViewPager-->
<android.support.v4.widget.ViewPager
bind:items="@{vm.itemVms}"
bind:view_provider="@{@layout/row_item}" />
Кроме того, существует поддержка отображения различных видов дочерних представлений на основе вашей ViewModel. См. раздел Использование различных типов дочерних представлений
Комментарии:
1. Отличный ресурс и интересный проект! Спасибо!
Ответ №2:
Как есть, это невозможно. Библиотека привязки данных Android использует статический макет XML и привязывает значения к атрибутам. Динамическое создание статического макета не поддерживается, и я предполагаю, что этого никогда не будет. Если вы хотите динамически создавать иерархию представлений, вам все равно следует использовать представления с адаптерами. Это то, что вы можете сделать с привязками данных. Просто создайте свой собственный адаптер привязки данных для привязки списка к a RecyclerVier
. Например, вы можете привязаться к паре binding:iterator
binding:layout
атрибутов and и установить RecyclerVier.Adapter
их внутри адаптера привязки данных.