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

Не удалось "findViewById" в Котлине. Получение ошибки "Ошибка ввода типа"

Я получаю следующую ошибку, когда пытаюсь найти RecycleView по id.

Ошибка: -Ошибка ввода типа: недостаточно информации для вывода параметра T

Ошибка

код:

class FirstRecycleViewExample : AppCompatActivity() {
    val data = arrayListOf<String>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_recycleview)

        val recycler_view =  findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR

        data.add("First Data")
        data.add("Second Data")
        data.add("Third Data")
        data.add("Forth Data")
        data.add("Fifth Data")

        //creating our adapter
        val adapter = CustomRecycleAdapter(data)

        //now adding the adapter to recyclerview
        recycler_view.adapter = adapter
    }
}
4b9b3361

Ответ 1

Попробуйте что-то вроде:

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)

Вы можете использовать Kotlin Android Extensions тоже для этого. Проверьте документ здесь.
С его помощью вы можете вызвать recycler_view непосредственно в вашем коде.

Расширения Android Kotlin:

  • В приложении gradle.build добавьте apply plugin: 'kotlin-android-extensions'
  • В вашем классе добавьте импорт для import kotlinx.android.synthetic.main.<layout>.*, где <layout> - это имя вашего макета.
  • Чтобы это, вы можете вызвать recycler_view прямо в свой код.

Как это работает? В первый раз, когда вы вызываете recycler_view, выполняется вызов findViewById и кешируется.

Ответ 2

Вы находитесь на уровне API 26, где тип возврата findViewById теперь является общим T вместо View и поэтому может быть выведен. Вы можете увидеть соответствующий список изменений здесь.

Итак, вы должны это сделать:

val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)

Или это:

val recycler_view: RecyclerView = findViewById(R.id.recycler_view)

Ответ 3

Обычно Kotlin может вывести ваш тип, используя информацию, содержащуюся в скобках.

В этом случае он не может быть так, что вам нужно было бы явно указать это

findViewById<RecyclerView>(R.id.recycler_view)

Не совсем уверен в типе, но вот как вы должны его указывать

Я хотел бы добавить, что, используя Anko, вы можете упростить свой код следующим образом:

val recycler_view : RecyclerView =  find(R.id.recycler_view)

Ответ 4

В Kotlin мы можем получить идентификатор представления без использования синтаксиса findViewById.

Например, мы используем следующий макет, из которого мы получим идентификатор представления и выполним операцию

Разметка

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/welcomeMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</FrameLayout>

Мы можем найти идентификатор представления, используя следующий код

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax
}

КАК?

Чтобы иметь возможность использовать его, вам нужен специальный импорт (тот, который я пишу ниже), но среда IDE может автоматически импортировать его. Не может быть проще!

import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView() 

Нам нужно импортировать это свойство, чтобы получить идентификатор представления без использования синтаксиса findViewById.

Для получения дополнительной информации по этой теме, пожалуйста, обратитесь к этой ссылке: - Нажмите здесь

Ответ 5

Попробуйте следующее:

Здесь bind общая функция используется для привязки представления. его общая функция, которую он может использовать для любого вида.

class MyActivity : AppCompatActivity() {
    private lateinit var recycler_view : RecyclerView
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        recycler_view = bind(R.id.recycler_view)
    }
}

fun <T : View> Activity.bind(@IdRes res : Int) : T {
    @Suppress("UNCHECKED_CAST")    
    return findViewById(res) as T
}

Ответ 6

Добавьте эту строку для своего кода как то, что вы используете с контроллером.

val tvHello = findViewById<TextView>(R.id.tvHello)

Ответ 7

Вы можете игнорировать предоставление идентификаторов переменным в kotlin. Вам просто нужно использовать плагин

Вставьте это в свой gradle

 apply plugin: 'kotlin-android-extensions'

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

 recycler_view.setAdapter(youradapter);

Ответ 8

Код: Другой способ сделать это.

class KotlinActivity : AppCompatActivity() {


        var recycler_view: RecyclerView? = null

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_kotlin)

            recycler_view = findViewById<RecyclerView>(R.id.recycler_view)


        }
    }