"kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized at..." 在设置 RecyclerView Adapter 时
"kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized at..." when setting up RecyclerView Adapter
换行错误:
recyclerView.adapter = mAdapter
代码:
class MainActivity : AppCompatActivity(), NewsItemClicked {
private lateinit var recyclerView:RecyclerView
private lateinit var mAdapter: NewsListAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
fetchData()
val verticalLayoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = verticalLayoutManager
recyclerView.adapter = mAdapter
}
private fun fetchData() {
val url =
"https://newsapi.org/v2/top-headlines?country=in&apiKey=*****"
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,
url,
null,
{
val newsJsonArray = it.getJSONArray("articles")
val newsArray = ArrayList<News>()
for (i in 0 until newsJsonArray.length()) {
val newsJsonObject = newsJsonArray.getJSONObject(i)
val news = News(
newsJsonObject.getString("title"),
newsJsonObject.getString("author"),
newsJsonObject.getString("url"),
newsJsonObject.getString("urlToImage")
)
newsArray.add(news)
}
mAdapter.updateNews(newsArray)
}, {
}
)
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)
}
override fun onItemClicked(item: News) {
val builder = CustomTabsIntent.Builder()
val customTabsIntent = builder.build()
customTabsIntent.launchUrl(this, Uri.parse(item.url))
}
}
来自 logcat 的错误:
2021-01-19 18:38:40.819 3869-3869/com.example.newsfresh E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.newsfresh, PID: 3869
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newsfresh/com.example.newsfresh.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized
at com.example.newsfresh.MainActivity.onCreate(MainActivity.kt:25)
at android.app.Activity.performCreate(Activity.java:7088)
at android.app.Activity.performCreate(Activity.java:7079)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
您还没有初始化您的 lateinit var mAdapter
变量。
Kotlin 允许您访问它,尽管它未初始化,因为它是 lateinit
,但它会抛出此异常。您可以通过以下两种方式解决此问题:
删除 lateinit
,在声明站点初始化:
在这种情况下,它可能是 val
:
private val mAdapter = NewsListAdapter(...)
这假定您已准备好在 Activity
启动时设置适配器所需的一切。一旦数据可用,您可能需要对其调用 notify...
方法之一。
如果你不...
确保在使用前已初始化
mAdapter = NewsListAdapter(...)
recyclerView.adapter = mAdapter
换行错误:
recyclerView.adapter = mAdapter
代码:
class MainActivity : AppCompatActivity(), NewsItemClicked {
private lateinit var recyclerView:RecyclerView
private lateinit var mAdapter: NewsListAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
fetchData()
val verticalLayoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = verticalLayoutManager
recyclerView.adapter = mAdapter
}
private fun fetchData() {
val url =
"https://newsapi.org/v2/top-headlines?country=in&apiKey=*****"
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,
url,
null,
{
val newsJsonArray = it.getJSONArray("articles")
val newsArray = ArrayList<News>()
for (i in 0 until newsJsonArray.length()) {
val newsJsonObject = newsJsonArray.getJSONObject(i)
val news = News(
newsJsonObject.getString("title"),
newsJsonObject.getString("author"),
newsJsonObject.getString("url"),
newsJsonObject.getString("urlToImage")
)
newsArray.add(news)
}
mAdapter.updateNews(newsArray)
}, {
}
)
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)
}
override fun onItemClicked(item: News) {
val builder = CustomTabsIntent.Builder()
val customTabsIntent = builder.build()
customTabsIntent.launchUrl(this, Uri.parse(item.url))
}
}
来自 logcat 的错误:
2021-01-19 18:38:40.819 3869-3869/com.example.newsfresh E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.newsfresh, PID: 3869
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newsfresh/com.example.newsfresh.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property madapter has not been initialized
at com.example.newsfresh.MainActivity.onCreate(MainActivity.kt:25)
at android.app.Activity.performCreate(Activity.java:7088)
at android.app.Activity.performCreate(Activity.java:7079)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
您还没有初始化您的 lateinit var mAdapter
变量。
Kotlin 允许您访问它,尽管它未初始化,因为它是 lateinit
,但它会抛出此异常。您可以通过以下两种方式解决此问题:
删除 lateinit
,在声明站点初始化:
在这种情况下,它可能是 val
:
private val mAdapter = NewsListAdapter(...)
这假定您已准备好在 Activity
启动时设置适配器所需的一切。一旦数据可用,您可能需要对其调用 notify...
方法之一。
如果你不...
确保在使用前已初始化
mAdapter = NewsListAdapter(...)
recyclerView.adapter = mAdapter