Я следил за учебником по студии Android и написал следующие строки:
RecyclerView.apply {this:RecyclerView!
var layoutManager = LinearLayoutManager(activity)
но «применить» выдавало мне ошибку, и когда я сделал Alt + Enter, я увидел два варианта импорта, которые я действительно не понял. они имели отношение к чему-то под названием «автоимпорт», и я увидел слово «гравитационный градиент». Предложения по какой-то причине исчезли после того, как я повозился с появившимися настройками, но ошибка все еще существует.
«Применить» доступно для любого объекта в kotlin. Вам не нужно ничего импортировать, чтобы использовать «применить»
Но если IDE предлагает вам импортировать что-либо для применения, это означает, что библиотека kotlin настроена неправильно.
Проверьте свои зависимости app/build.gradle, существует ли kotlin-stdlib или нет.
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
вот почему я был сбит с толку. Но да, я только что зашел в зависимости в структуре проекта и увидел в списке «реализация» org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version. так что скорее всего не в этом дело.
это потому, что RecyclerView не является экземпляром. Вы не можете использовать «применить» в классе.
Вы можете сделать что-то вроде этого
val recyclerView = findViewById<RecyclerView>(R.id.your_recycler)
recyclerView.apply {
layoutManager = LinearLayoutManager(activity)
}
я назвал свой recyclerview идентификатором recyclerview и использовал его для его вызова. как часть обучения.
какой туториал? Вы не можете дать имя класса объекту
ее переработчик называется «restaurantsRecyclerView», а не «RecyclerView». И он использует синтетические материалы kotlin, которые сейчас устарели. Поэтому вам нужно создать переменную перед вызовом «применить», как в моем ответе.
да, я изменил имя, но теперь я вижу. Так в этом и была проблема?
Да, компилятор разрешает "RecyclerView" как ссылку на класс RecyclerView. Только классы должны иметь имя с заглавной буквы. Но вы также должны прочитать о миграции с kotlin synthetics на привязку просмотра
Вот как работает apply
:
val recyclerView = RecyclerView(context)
recyclerView.adapter = MyAdapter()
recyclerView.layoutManager = LinearLayoutManager()
recyclerView.hasFixedSize = true
против
val recyclerView = RecyclerView(context).apply {
adapter = MyAdapter()
layoutManager = LinearLayoutManager()
hasFixedSize = true
}
вы запускаете его на экземпляре объекта, который становится this
в лямбде, поэтому вы можете выполнять все вызовы объекта, не обращаясь к нему по имени. И исходный объект появляется в конце, поэтому вы можете назначить все это val recyclerView
— он получит созданный вами RecyclerView()
с несколькими настройками apply
, добавленными к нему. Таким образом, объекты настраиваются подобным образом.
Итак, как говорили люди, вы не вызывали apply
экземпляр RecyclerView
, вы вызывали его в самом классе, что не работает. Вам нужно создать вещь. Синтетическая привязка Kotlin — это волшебный код, который автоматически создает объекты для вас из XML, который он расширяет, и назначает их переменной, названной в соответствии с идентификатором представления в XML. Таким образом, ваш учебник ссылается на экземпляр, используя имя переменной, которое синтетика объявила в фоновом режиме. Это сбивает с толку, если вы не знаете об этом, и мне интересно, является ли это частью причины, по которой он устарел.
Ответ Sinner of the System — это самый простой (и нормальный) способ получить объект из вашего макета, самостоятельно найдя его по идентификатору.
RecyclerView — это класс; вы не можете вызывать
apply
статически. Если RecyclerView является идентификатором и вы используете синтетические методы или решили назвать это поле, переименуйте его сейчас. Компилятор может не определить, имеете ли вы в виду переменную или класс. Если вы использовали синтетику Kotlin, обратите внимание, что она устарела. Используйте свою любимую поисковую систему для альтернатив. (Ты что-то ищешь реактивный ранец, точно не помню).