Not able to "findViewById" in Kotlin. Getting error "Type inference failed"

Usually Kotlin can infer your type using the info provided in the brackets.

In this case, it can't so you would have to specify it explicitly like this

findViewById<RecyclerView>(R.id.recycler_view)

Not really sure about the type though but that is how you should specify it

I'd like to add that, using Anko, you can further simplify your code like this:

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

DEPRECATED

In Kotlin we can get the id of the view without the use of the findViewById syntax.

For example we are using the following the layout from that we will get the id of the view and perform operation

Layout

<?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>

We are able to find the id of the view by using the following code

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
}

HOW?

To be able to use it, you need an special import (the one I write below), but the IDE is able to auto-import it. Couldn’t be easier!

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

We need to import this property to get the id of the view without the use of the findviewbyid syntax.

For more information on this topic than please refer this link :- Click here

UPDATE

Now the kotlin-android-extensions is deprecated , instead of using the kotlin provided binding , we can use now the View-Binding and it works same as above solution, Just you need to use the below in your app gradle

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

You're on API level 26, where the return type of findViewById is now a generic T instead of View and can therefore be inferred. You can see the relevant changelog here.

So you should be able to do this:

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

Or this:

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

Try something like:

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

You can use Kotlin Android Extensions too for that. Check the doc here.
With it, you can call recycler_view directly in your code.

Kotlin Android Extensions:

  • In your app gradle.build add apply plugin: 'kotlin-android-extensions'
  • In your class add import for import kotlinx.android.synthetic.main.<layout>.* where <layout> is the filename of your layout.
  • That's it, you can call recycler_view directly in your code.

How does it work? The first time that you call recycler_view, a call to findViewById is done and cached.