Kotlin recyclerview给了我空指针异常

时间:2018-02-05 10:12:09

标签: android android-recyclerview kotlin

我在使用Java之后开始学习Kotlin,并尝试使用Kotlin创建recyclerview,但每次都能达到此代码:

recyclerview!!.layoutManager = LinearlayoutManager(context)

在片段内部,它总是为我返回null,并通过在android studio中使用转换器转换现有的Java代码返回错误。任何人都可以帮助我为什么总会发生这种情况?下面的代码是我当前的片段代码:

import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.fragment_notes.*
import java.sql.Timestamp

class NotesFragment : Fragment() {

    companion object {
        fun newInstance(): NotesFragment {
            return NotesFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater?.inflate(R.layout.fragment_notes, container, false)
        val messageList : MutableList<message> = prepareMessage()

        recycler_view!!.layoutManager = LinearLayoutManager(context)
        recycler_view!!.adapter = NotesAdapter(context)   
        (recycler_view!!.adapter as NotesAdapter).setMessage(messageList)
        return view
    }

    private fun prepareMessage(): MutableList<message> {
        var messageList : MutableList<message> = ArrayList()
        for(i in 0..10){
            val timestamp: Long = System.currentTimeMillis()/1000L
            val message = message(0,
                    "Judul Catatan ke $i",
                    resources.getString(R.string.lipsum),
                    timestamp
                    )
            messageList.add(message)
        }
        return messageList
    }

}

4 个答案:

答案 0 :(得分:2)

那是因为onCreateView中尚未创建视图。由于您使用的是kotlinx.android.synthetic,因此您需要在onViewCreated内访问它。就像这样

   override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     val view = inflater?.inflate(R.layout.fragment_notes, container, false)
     return view
   }


  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    recycler_view = view.findViewById(R.id.your_recycler_id)
    recycler_view?.layoutManager = LinearLayoutManager(context)
    recycler_view?.adapter = NotesAdapter(context)

    val messageList : MutableList<message> = prepareMessage()
    (recycler_view?.adapter as NotesAdapter).setMessage(messageList)
}

答案 1 :(得分:0)

你有没有像这样宣布你的recylerview

 polishrecyler = view .findViewById<View>(R.id.polish_recyler) as RecyclerView

答案 2 :(得分:0)

试试这个......

在访问其属性之前,您应该声明您的recyclerview对象。

.....

 private var recycler_view: RecyclerView? = null

.....

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater?.inflate(R.layout.fragment_notes, container, false)

    recycler_view = view.findViewById(R.id.your_recycler_id)
    recycler_view?.layoutManager = LinearLayoutManager(context)
    recycler_view?.adapter = NotesAdapter(context)  

    val messageList : MutableList<message> = prepareMessage()
    (recycler_view?.adapter as NotesAdapter).setMessage(messageList)
    return view
}

答案 3 :(得分:0)

我刚才也有类似情况。

在我的项目中,我有一个RecyclerView运行良好。就我而言,它涉及五个文件:Foo.kt(模型),FooList.ktAppCompatActivity类),FooListAdapter.ktfoo_list.xml(具有RecyclerView)和foo_list_row.xml(我对ReyclerView的自定义行)。不确定是否重要,但是Foo.kt的图标为enter image description here,而FooList.ktFooListAdapter.kt的图标为enter image description here

我需要另一个RecyclerView,所以我只创建了五个新文件:Bar.ktBarList.kitBarListAdapter.kitbar_list.xmlbar_list_row.xml。我将代码从一个复制/粘贴到另一个,然后在代码中进行了相应的Foo-> Bar更改。这是我遇到与OP相同的错误的时候。在import部分中,RecyclerView的导入被标记为“多余”。奇怪的。

此处建议的大多数答案是声明变量并使用findViewById进行引用。但是,我的工作RecyclerView并没有这样做,那么为什么在第二个RecyclerView中有必要这样做呢?这没有道理。

我继续搜索并找到了解决方案:

  1. 保存在我手动创建的两个文件中找到的代码(BarList.kit (AppCompatActivity文件)和“相应的” bar_list.xml
  2. 删除这些文件。
  3. 右键单击软件包名称,然后选择New > Activity > Empty Activity。这样就重新创建了我刚删除的文件,它们的名称完全相同。
  4. 将第1步中保存的代码恢复到适当的文件中。

现在我两个RecyclerView都可以正常工作。

我猜您在使用New > Activity > Empty Activity时,Android Studio在后台执行了一些工作,如果您只是手动创建文件,则不会完成。