Подтвердить что ты не робот

Синтетический синтез Kotlin в адаптере или ViewHolder

Я новичок в котлине. Я нашел и попытался использовать синтетический метод вместо раздражающего метода findViewById в моем классе Activity, но я нашел "Если мы хотим вызывать синтетические свойства в представлении (полезно в классах адаптеров), мы также должны импортировать kotlinx.android.synthetic.main.view. *". Но я не могу понять, как это работает? Есть ли примеры?

4b9b3361

Ответ 1

Простой пример из https://github.com/antoniolg/Kotlin-for-Android-Developers

import kotlinx.android.synthetic.item_forecast.view.*

class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        fun bindForecast(forecast: Forecast) {
            itemView.date.text = forecast.date.toDateString()
        }
    }
}

Не нужно писать

val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()

Просто

itemView.date.text = forecast.date.toDateString()

Простой и эффективный!

Ответ 2

Котлинг 1.1.4 из

Дополнительная информация: https://antonioleiva.com/kotlin-android-extensions/

Поэтому вам нужно включить их, добавив это в build.gradle:

apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
    experimental = true
}

Начиная с этой новой версии Kotlin, в Android Extensions были добавлены некоторые новые интересные функции: кеши в любом классе (что интересно включает ViewHolder)

Использование его в ViewHolder (или любом другом классе)

class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
        LayoutContainer {

    fun bind(title: String) {
        itemTitle.text = "Hello Kotlin!"
    }
}

Ответ 3

Вам нужно

import kotlinx.android.synthetic.row_wall.view.*

И позже что-то вроде:

convertView.titleText.text = item.title

Дело в том, что представление. * вводит расширения класса View.

Ответ 5

Если вы используете последнюю версию l; вам не нужно добавлять к ней экспериментальный = true.

на уровне проекта Gradle

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'

И на уровне приложения Gradle

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' //These should be on the top of file.

и в зависимости..

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'

и импортировать ниже как

import kotlinx.android.synthetic.main.your_layout_file_name.view.*

и пример

import kotlinx.android.synthetic.main.item_animal.view.*

class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) {

    override fun bindData(animal: Animal) {
        itemView.tv_animal.text = animal.title
    }
}

где BaseViewHolder

abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder(
    LayoutInflater.from(parent.context).inflate(layoutID, parent, false)
) {
    abstract fun bindData(model: T)
}

Ответ 6

Это означает, что вы должны поместить эту строку в начало исходного файла:

import kotlinx.android.synthetic.main.view.*

Итак, вместо, например, findView(R.id.textView) as TextView вы должны написать просто textView. Последний является синтетическим свойством расширения, расположенным в пакете kotlinx.android.synthetic.main.view, поэтому вам нужно импортировать все из него.

Там учебник на официальном сайте, посмотрите.

Ответ 7

К вашему сведению: привязка данных рекомендуется более синтетической для просмотра просмотра Эй! Разработчик Advocate для Android на Google здесь!

Комментарий от DA для Android от Google на Reddit

Привет! Разработчик Advocate для Android на Google здесь!

Я хотел бы добавить немного фона здесь. Расширения Kotlin с синтетическими представлениями никогда не были намеренно "рекомендованы", хотя это не следует воспринимать как рекомендацию не использовать их. Если они работают на вас, пожалуйста, продолжайте использовать их в своем приложении!

Мы отошли от них (например, мы не преподаем их в курсе Udacity), потому что они предоставляют глобальное пространство имен идентификаторов, которое не связано с макетом, которое фактически раздуто без проверок на недопустимые поиски, являются только Kotlin и не подвергают обнуляемости когда представления присутствуют только в некоторой конфигурации. Все вместе эти проблемы приводят к увеличению количества сбоев API для приложений Android.

С другой стороны, они предлагают легкий API, который может помочь упростить поиск в представлении. В этом пространстве также стоит взглянуть на привязку данных, которая также выполняет автоматический просмотр представлений, а также интегрируется с LiveData для автоматического обновления ваших представлений при изменении данных.

Сегодня в этом пространстве есть несколько вариантов работы:

Привязка данных является рекомендацией как для просмотра представления, так и для привязки, но она добавляет некоторые накладные расходы по сравнению с расширениями Android Kotlin. Стоит посмотреть, подходит ли это для вашего приложения. Привязка данных также позволяет вам наблюдать LiveData, чтобы автоматически связывать представления при изменении данных. По сравнению с Kotlin Extensions он добавляет проверку времени компиляции поиска и безопасности типов. Android Kotlin Extensions официально не рекомендуется (что не совпадает с рекомендациями против). Это связано с вышеупомянутыми проблемами, поэтому для нашего кода мы их не используем. Butter Knife - еще одно чрезвычайно популярное решение, которое работает как для Kotlin, так и для языка программирования Java. Прочитав комментарии здесь, есть много разработчиков, которым очень повезло с Kotlin Extensions. Это здорово - и кое-что мы будем иметь в виду, когда будем искать пути дальнейшего улучшения наших API. Если вы еще не ознакомились с привязкой данных, обязательно попробуйте.

Кроме того, наше внутреннее руководство по стилю кода не предназначено для непосредственного применения вне нашей кодовой базы. Например, мы используем mPrefixVariables, но нет причин, по которым каждое приложение должно следовать этому стилю.