Ошибка для «применить» в kotlin на студии Android

Я следил за учебником по студии Android и написал следующие строки:

RecyclerView.apply {this:RecyclerView!
            var layoutManager = LinearLayoutManager(activity)

но «применить» выдавало мне ошибку, и когда я сделал Alt + Enter, я увидел два варианта импорта, которые я действительно не понял. они имели отношение к чему-то под названием «автоимпорт», и я увидел слово «гравитационный градиент». Предложения по какой-то причине исчезли после того, как я повозился с появившимися настройками, но ошибка все еще существует.

RecyclerView — это класс; вы не можете вызывать apply статически. Если RecyclerView является идентификатором и вы используете синтетические методы или решили назвать это поле, переименуйте его сейчас. Компилятор может не определить, имеете ли вы в виду переменную или класс. Если вы использовали синтетику Kotlin, обратите внимание, что она устарела. Используйте свою любимую поисковую систему для альтернатив. (Ты что-то ищешь реактивный ранец, точно не помню).

Zoe stands with Ukraine 26.12.2020 15:15
0
1
685
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

«Применить» доступно для любого объекта в kotlin. Вам не нужно ничего импортировать, чтобы использовать «применить»

Подать заявку в Котлине

Но если IDE предлагает вам импортировать что-либо для применения, это означает, что библиотека kotlin настроена неправильно.

Проверьте свои зависимости app/build.gradle, существует ли kotlin-stdlib или нет.

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

вот почему я был сбит с толку. Но да, я только что зашел в зависимости в структуре проекта и увидел в списке «реализация» org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version. так что скорее всего не в этом дело.

Ahmed Anwer 25.12.2020 22:45

это потому, что RecyclerView не является экземпляром. Вы не можете использовать «применить» в классе.

Вы можете сделать что-то вроде этого

val recyclerView = findViewById<RecyclerView>(R.id.your_recycler)
recyclerView.apply {
    layoutManager = LinearLayoutManager(activity)
}

я назвал свой recyclerview идентификатором recyclerview и использовал его для его вызова. как часть обучения.

Ahmed Anwer 25.12.2020 23:23

какой туториал? Вы не можете дать имя класса объекту

Sinner of the System 25.12.2020 23:44
youtube.com/watch?v=4jgYGrms5VA&t=666s 10:56 можно посмотреть
Ahmed Anwer 25.12.2020 23:45

ее переработчик называется «restaurantsRecyclerView», а не «RecyclerView». И он использует синтетические материалы kotlin, которые сейчас устарели. Поэтому вам нужно создать переменную перед вызовом «применить», как в моем ответе.

Sinner of the System 25.12.2020 23:56

да, я изменил имя, но теперь я вижу. Так в этом и была проблема?

Ahmed Anwer 26.12.2020 00:24

Да, компилятор разрешает "RecyclerView" как ссылку на класс RecyclerView. Только классы должны иметь имя с заглавной буквы. Но вы также должны прочитать о миграции с kotlin synthetics на привязку просмотра

Sinner of the System 26.12.2020 01:19
Ответ принят как подходящий

Вот как работает 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 — это самый простой (и нормальный) способ получить объект из вашего макета, самостоятельно найдя его по идентификатору.

Другие вопросы по теме