私のリサイクルビューには、次のViewHolderクラスがあります。
inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val dateText = itemView.itemDateSummaryList
private val systolicVal = itemView.systolicValue
private val diastolicVal = itemView.diastolicValue
fun update(listItem: SummaryListItemModel) {
Log.i(TAG, "Update method called " + listItem.date)
dateText.text = listItem.date
systolicVal.text = listItem.sysVal.toInt().toString()
diastolicVal.text = listItem.diasVal.toInt().toString()
}
}
しかし、アプリを実行すると、dateText.text = listItem.date
言って、
Java.lang.IllegalStateException: dateText must not be null
at *****.******.*****.ui.detailview.bloodpressure.SummaryListAdapter$ItemViewHolder.update(SummaryListAdapter.kt:68)
しかし listItem.date
はnullではありませんログで確認しました。
エラーはlistItem.date
に関するものではありません。エラーは、テキストを設定しようとしているdateText
textviewがnullであると言います。
正しいtextview
を使用していることを再確認してください
可能性:
1)id
の間違ったtextview
を使用している可能性があります
2)ビューの拡大中に間違ったファイルを使用した可能性があります。
ctrl
+ itemDateSummaryList
をクリックして、textview
がinfate
のレイアウトファイルと同じかどうかを確認します
フラグメントを使用している場合: 1.レイアウト参照を保持するグローバル変数を使用します
private var root: View? = null // create a global variable which will hold your layout
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
root = inflater.inflate(R.layout.your_layout_file_name, container, false) // initialize it here
return root
}
2.レイアウト内にあるレイアウトのビューを使用するには、(root.
)のような:
root!!.textView.text="Hello"
dateText
ビュー自体は値listItem.date
ではなくnullであると言っています。正しく表示しているかどうかを確認してください。itemview
には、アクセスしようとしているIDを持つTextView
私はこのエラーをフラグメントで受け取り、このエラーを解決しました。
エラーのコード:
class MyFragment : Fragment(){
private var item: Item? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
item = arguments?.getParcelable(BUNLDE_ITEM)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
item?.let {
textViewTitle.text = "Text"
}
return inflater.inflate(R.layout.my_fragment, null, false)
}
companion object {
private const val BUNLDE_ITEM = "item"
fun newInstance(item: Item) = MyFragment().apply {
arguments = Bundle().apply {
putParcelable(BUNLDE_ITEM, item)
}
}
}
}
作業コード:
class MyFragment : Fragment() {
private var item: Item? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
item = arguments?.getParcelable(BUNLDE_ITEM)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val root: View = inflater.inflate(R.layout.my_fragment, container, false)
val textViewTitle = root.findViewById<View>(R.id.textViewTitle) as TextView
item?.let {
textViewTitle.text = "text"
}
return root
}
companion object {
private const val BUNLDE_ITEM = "item"
fun newInstance(item: Item) = MyFragment().apply {
arguments = Bundle().apply {
putParcelable(BUNLDE_ITEM, item)
}
}
}
}
私はちょうど私のRecyclerViewで同じ問題を抱えていました。それは何ヶ月も働いていました。多数の失敗したトラブルシューティング手順の後、Build> Clean Projectを実行し、問題を修正しました。
また、xmlファイルの間違ったコンテキスト参照で発生する可能性があります。通常、手動でActivityを別のパッケージに移動すると表示されます。Android studioはこの変更を自動的に行いませんでした
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:tools="http://schemas.Android.com/tools"
....
tools:context=".view.ui.login.LoginActivity">
....
</androidx.constraintlayout.widget.ConstraintLayout>
Fragmentを使用しているときにも同じことが起こりました。コードをonCreateView
から取得し、onViewCreated
メソッドに配置すると、問題が解決しました。