java.lang.IllegalStateException:TextView不能为null(Android / Kotlin)

时间:2017-11-21 06:07:40

标签: android android-recyclerview kotlin recycler-adapter

我的Recycler View有以下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不为空我已经检查了日志。

9 个答案:

答案 0 :(得分:5)

错误不是listItem.date,错误表示您尝试设置文本的dateText文本视图为空,

仔细检查您是否使用了正确的textview

可能性:
1)您可能使用id textview的错误ctrl 2)您在浏览视图时可能使用了错误的文件。

itemDateSummaryList +点击textview,查看infate是否来自同一个布局文件fitness或其他

答案 1 :(得分:4)

它说dateText视图本身为空而不是值listItem.date验证您是否正确呈现它,itemviewTextView您尝试访问的ID

答案 2 :(得分:2)

如果您正在使用片段: 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"

答案 3 :(得分:1)

我收到此错误是我的片段, 我解决了这个错误,

错误代码:

StreamBuilder<UnmodifiableListView<Article>> (
        initialData: UnmodifiableListView<Article>([]),
        stream: widget.hnBloc.article,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView(
              children: snapshot.data.map(_buildItem).toList(),
            );
          } else {
            return CircularProgressIndicator();
          }
        }
      ),

工作代码:

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

答案 4 :(得分:1)

我阅读了所有这些答案,但没有一个对我有用,所以这是我的答案。

找到与此类似的代码行:

var view:View?=inflater.inflate(R.layout.fragment_profilefragement, container, false)

将光标置于fragement_ProfileFragement上,然后用 CTRL 单击。检查您是否在正确的碎片 XML文件中。

答案 5 :(得分:0)

使用Fragment时我也遇到了同样的情况,我从onCreateView提取了代码并将其放入onViewCreated方法中,问题得以解决。

答案 6 :(得分:0)

我的RecyclerView遇到了同样的问题。它已经工作了几个月了。经过大量失败的故障排除步骤后,我执行了Build> Clean Project并解决了该问题。

答案 7 :(得分:0)

它也可能发生在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>

答案 8 :(得分:0)

您已仔细查看,因为在您的代码的某些部分您没有正确引用视图。换句话说,您的代码中不存在该特定视图。

  1. 尝试重复您所做的步骤
  2. 检查代码失败的类,您的视图是否正确膨胀。

这将节省您数小时查找错误的时间。