2017-10-27 4 views
0

onBindViewHolderonCreateViewHolderのたびに?.!!.を使用する必要がありますか?これを避ける方法はありますか?null許容可能な受信者に対しては、安全な(?)または非nullのアサート(!!)コールのみが許可されます

holder.textview.textおよびparent.contextこのエラーを示します。

コード:

override fun onBindViewHolder(holder: ViewHolder?, position: Int) { 
    holder.textview.text = items[position] 
} 

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int):ViewHolder { 
    return ViewHolder(TextView(parent.context)) 
} 

答えて

3

あなたはJavaで宣言されたメソッドをオーバーライドしている、そのパラメータは、プラットフォームの種類がありますが、それらについてのNULL可能情報は、(彼らはexplicitly annotatedだ場合を除く)がないことを意味します。これらのパラメータにnullをマークするかどうかを決めるのはあなた次第です。 platform typesの公式ドキュメントを参照してください。

あなたのケースでは、nullという値が決して渡されないので、これらのパラメータの両方から?を安全に削除することができます。これにより、強制ヌルチェックを実行する必要がなくなります。


は、ここでそれが削除さNULL可能タイプで、次のようになります。

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.textview.text = items[position] 
} 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
    return ViewHolder(TextView(parent.context)) 
} 
+0

のでそれは私が使用する必要がある意味最も確かにあります「?」または '!!'常に? – Yeahia2508

+1

いいえ、この場合、 'holder'と' parent'が決して 'null'にならないことを知っているので、それぞれの型を' ViewHolder'と 'ViewGroup'にすることができます。これで、安全な通話を使用することは強制されません。 – zsmb13

+1

そして、メソッドが 'null'で呼び出された場合、あなたに例外を通知します。 –

1

あなたonCreateViewHolderときのカウント> 0、そうにその金庫にヌルviewholderを作成した場合しない限り、viewholderがnullになることはありません?

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.textview.text = items[position] 
} 
1

を削除し、あなたの例のように、NULL可能なタイプで作業する場合、あなたのコードに安全対策を適用する必要があります。毎回?.を使用するか、パラメータが!=nullかどうかを確認してください。このようなifの後、コンパイラはこのパラメータへの呼び出しが安全であり、nullは不可能であることを認識します。

特殊なケースでは、null可能な型を持つ必要はありません。パラメータから疑問符を取り除くだけで、すべてが問題ありません。ところで

!!を使用しない、よりよい解決策

関連する問題