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 Extensions:
gradle.build
を追加しますapply plugin: 'kotlin-Android-extensions'
import kotlinx.Android.synthetic.main.<layout>.*
のインポートを追加します。ここで<layout>
はレイアウトのファイル名です。recycler_view
を直接呼び出すことができます。どのように機能しますか? recycler_view
を初めて呼び出すと、findViewById
の呼び出しが行われ、cachedが実行されます。
APIレベル26で、findViewById
の戻り値の型がT
の代わりに汎用View
になったため、推測できるようになりました。関連する変更ログを見ることができます here 。
だからあなたはこれを行うことができるはずです:
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
構文を使用せずにビューの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
}
HOW?
使用できるようにするには、特別なインポート(以下に記述するもの)が必要ですが、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
構文を使用せずにビューのIDを取得するには、このプロパティをインポートする必要があります。
このトピックの詳細については、このリンクを参照してください:- ここをクリック
コントローラーを使用しているものとして、コードにこの行を追加します。
val tvHello = findViewById<TextView>(R.id.tvHello)
これを試して:
ここで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の変数にIDを与えることは無視できます。プラグインを使用するだけです
これをGradleに貼り付けます
apply plugin: 'kotlin-Android-extensions'
そして、あなたはvarにidを割り当てる必要はありません、あなたはちょうどそれをすることができます
recycler_view.setAdapter(youradapter);
ビューで物事を行うためにオブジェクトを作成する必要さえありません。あなただけのIDを使用することができます。たとえば、Kotlin
recycle_view.adapter = adapter
Javaと同じ
RecycleView recycle_view = (RecycleView) findViewById(recycle_view);
recycle_view.setAdapter(adapter);
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)
}
}