无法在Kotlin中“findViewById”。 获取错误“类型推断失败”

当我尝试按ID查找RecycleView时,出现以下错误。

错误: –类型推断失败:没有足够的信息来推断参数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

Kotlin Android扩展:

  • 在你的应用gradle.build添加apply plugin: 'kotlin-android-extensions'
  • 在你的类中添加import 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) 

尝试这个:

这里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 } 

Kotlin我们可以在不使用findViewById语法的情况下获得视图的ID。

比如我们使用下面的布局,我们将得到视图的id并执行操作

布局

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

我们可以通过使用下面的代码找到视图的id

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

我们需要导入这个属性来获取视图的id,而不使用findviewbyid语法。

有关此主题的更多信息,请参阅此链接: – 点击这里

您可以忽略对kotlin中的变量的ID。 你只需要使用一个插件

将其粘贴到你的Gradle中

  apply plugin: 'kotlin-android-extensions' 

然后你不需要分配id到var,你可以这样做

  recycler_view.setAdapter(youradapter);