Как я могу выполнять циклы for с привязкой данных Android?

#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 их внутри адаптера привязки данных.