Как ссылаться на ArrayListпеременные типа и объекты в нем с индексом в Kotlin, с шаблоном MVVM и применением привязки данных? - PullRequest
1 голос
/ 28 сентября 2019

Я создаю приложение с применением шаблона MVVM.Я добавил все необходимые зависимости.Кроме того, я знаю, как передавать переменные в мои файлы макета XML и как использовать функцию, используя их в качестве параметров.Но я просто не знаю, как обрабатывать переменные типа ArrayList.

Это часть объявления класса данных из моего activity_main.xml

<variable
      name="vm"
      type="com.example.mvvm.MainActivityViewModel" />
<variable
      name="codeBlock"
      type="java.util.ArrayList"/>
<variable
      name="block"
      type="com.example.mvvm.CodeBlock" />

И эти данные связываются в MainActivity.

val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)

//binds data
binding.vm = mMainActivityViewModel
binding.lifecycleOwner = this
binding.codeBlock = mMainActivityViewModel.getBlockButton()

поэтому я передал ArrayList пользовательских классов, каждый из которых называется CodeBlock.И вот что я попробовал:

<TextView
      android:id="@+id/bt_move"
      style="?android:attr/buttonBarButtonStyle"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/move"
      android:textAllCaps="false"
      android:textColor="@color/Black"
      android:onClick="@{vm.addNewBlock(codeBlock[0])}"/>

или нет [0], но .get(0)

, и я думаю, или я уверен, что это потому, что тип codeBlock[0] переменная неоднозначна.В MainActivity эта штука дает мне знак ошибки.

var ff : CodeBlock = binding.codeBlock[0]

Type Mismatch , Required : CodeBlock Found : Any!

Почему ???Я дал ему ArrayList, и он получил это?

Кроме того, это также дает мне ошибку.

var ff : ArrayList<CodeBlock> = binding.codeBlock

Smart cast to 'kotlin.collections.ArrayList<CodeBlock> /*= java.util.ArrayList<CodeBlock> */' is impossible, because 'binding.codeBlock' is a mutable property that could have been changed by this time

Ну, долженЯ использую kotlin.collections.ArrayList<CodeBlock>?но в типе переменной в activity_main.xml он не поддерживает этот тип.Кажется, он поддерживает только типы из Java.Я не могу найти kotlin.collections.ArrayList.Итак, как я могу передать переменные типа ArrayList для просмотра?А это свойство ArrayList?это не изменится.Это список блоков, которые пользователь может выбрать на этапе.Так что он не должен быть изменяемым.

Когда я пытаюсь запустить код, появляется сообщение cannot find method addNewBlock(java.lang.Object) in class com.example.mvvm.MainActivityViewModel

...