可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am getting the following error when I try to find a RecycleView
by id.
Error:-
Type inference failed: Not enough information to infer parameter T
Code:
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
}
}
回答1:
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.
回答2:
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)
回答3:
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)
回答4:
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
回答5:
Add this line for your code as Whatever you are using controller.
val tvHello = findViewById<TextView>(R.id.tvHello)
回答6:
Try this:
Here bind
generic function use to bind view. its general function it's can use for any view.
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
}
回答7:
You can ignore giving ids to variables in kotlin. You just need to use a plugin
Paste this in your gradle
apply plugin: 'kotlin-android-extensions'
and then you don't need to assign ids to var, you can just do it like
recycler_view.setAdapter(youradapter);
回答8:
Code: Another way to do it.
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)
}
}
回答9:
You don't even have to create an object to do things with a view.
You can just use the id. For example,
Kotlin
recycle_view.adapter = adapter
is same as,
Java
RecycleView recycle_view = (RecycleView) findViewById(recycle_view);
recycle_view.setAdapter(adapter);