我在使用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
}
}
答案 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.kt
(AppCompatActivity
类),FooListAdapter.kt
,foo_list.xml
(具有RecyclerView
)和foo_list_row.xml
(我对ReyclerView
的自定义行)。不确定是否重要,但是Foo.kt
的图标为,而FooList.kt
和FooListAdapter.kt
的图标为
我需要另一个RecyclerView,所以我只创建了五个新文件:Bar.kt
,BarList.kit
,BarListAdapter.kit
,bar_list.xml
和bar_list_row.xml
。我将代码从一个复制/粘贴到另一个,然后在代码中进行了相应的Foo-> Bar更改。这是我遇到与OP相同的错误的时候。在import
部分中,RecyclerView
的导入被标记为“多余”。奇怪的。
此处建议的大多数答案是声明变量并使用findViewById
进行引用。但是,我的工作RecyclerView
并没有这样做,那么为什么在第二个RecyclerView
中有必要这样做呢?这没有道理。
我继续搜索并找到了解决方案:
BarList.kit
(AppCompatActivity文件)和“相应的” bar_list.xml
)New > Activity > Empty Activity
。这样就重新创建了我刚删除的文件,它们的名称完全相同。现在我两个RecyclerView
都可以正常工作。
我猜您在使用New > Activity > Empty Activity
时,Android Studio在后台执行了一些工作,如果您只是手动创建文件,则不会完成。