Не удалось «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 } } 

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

 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 выполняется и кэшируется .

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

Поэтому вы должны это сделать:

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

Или это:

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

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

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

 findViewById<RecyclerView>(R.id.recycler_view) 

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

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

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

В 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 .

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

Попробуй это:

Здесь 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 } 

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

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

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

Вставьте это в свой град

  apply plugin: 'kotlin-android-extensions' 

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

  recycler_view.setAdapter(youradapter); 

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

 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) } } 

Вам даже не нужно создавать объект для работы с представлением. Вы можете просто использовать идентификатор. Например, гостиницы

 recycle_view.adapter = adapter 

такая же, как Java

 RecycleView recycle_view = (RecycleView) findViewById(recycle_view); recycle_view.setAdapter(adapter);