在 RecyclerView 配接器中有一個 NameListHolder 類的代碼
class NameListHolder(val binding: NameListItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(paginationLocalModel: PaginationLocalModel, position: Int, context: NameListFragment){
binding.name.text = paginationLocalModel.name
itemView.setOnClickListener{
val fragment = DescriptionFragment()
val bundle = Bundle()
bundle.putInt("position", position)
fragment.setArguments(bundle)
val activity=context.context as AppCompatActivity
activity.supportFragmentManager
.beginTransaction()
.replace(R.id.rd_fragment, fragment)
.commitNow()
Log.d("OnClick", "произошло нажатие по позиции $position")
}
}
}
片段內部itemView.setOnClickListener
應該觸發,但是當我單擊串列項時,NullPointerException
會拋出 a:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sem.receivedata, PID: 5484
java.lang.NullPointerException
at com.sem.receivedata.presentation.DescriptionFragment.<init>(DescriptionFragment.kt:22)
at com.sem.receivedata.presentation.adapters.NameListAdapter$NameListHolder.bind$lambda-0(NameListAdapter.kt:49)
at com.sem.receivedata.presentation.adapters.NameListAdapter$NameListHolder.$r8$lambda$FuXGFWDKhm2ZD3YhtF7Xh98aUvc(Unknown Source:0)
at com.sem.receivedata.presentation.adapters.NameListAdapter$NameListHolder$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
DescriptionFragment.kt:22
指向片段val position: Int = bundle!!.getInt("position", 0)
內的字串DescriptionFragment
NameListAdapter.kt:49
指向val fragment = DescriptionFragment()
里面的線NameListHolder
Unknown Source:0
并且Unknown Source:4
始終指向第 0 行和第 4 行,無論那里有什么(在newInstance()
匯入之前)
整個資料鏈:
NameListFragment
:
class NameListFragment : Fragment() {
...
private fun initRecyclerExchangeRate(){
binding?.listNameRV?.layoutManager =
LinearLayoutManager(context)
nameListAdapter = NameListAdapter(this)
binding?.listNameRV?.adapter = nameListAdapter
}
...
}
NameListAdapter
:
class NameListAdapter(var context: NameListFragment
) : RecyclerView.Adapter<NameListAdapter.NameListHolder>() {
...
override fun onBindViewHolder(holder: NameListHolder, position: Int) {
holder.bind(pagination[position], position, context)
}
...
class NameListHolder(val binding: NameListItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(paginationLocalModel: PaginationLocalModel, position: Int, context: NameListFragment){
binding.name.text = paginationLocalModel.name
itemView.setOnClickListener{
val fragment = DescriptionFragment()
val bundle = Bundle()
bundle.putInt("position", position)
fragment.setArguments(bundle)
val activity=context.context as AppCompatActivity
activity.supportFragmentManager
.beginTransaction()
.replace(R.id.rd_fragment, fragment)
.commitNow()
Log.d("OnClick", "произошло нажатие по позиции $position")
}
}
}
...
}
DescriptionFragment
:
class DescriptionFragment : Fragment() {
...
val bundle: Bundle? = this.getArguments();
val position: Int = bundle!!.getInt("position", 0)
...
}
從 Activity 啟動第一個片段是在標記內完成的:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".presentation.MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@ id/framelayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@ id/rd_fragment"
android:name="com.sem.receivedata.presentation.NameListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
uj5u.com熱心網友回復:
您正在此行中創建新片段
val fragment = DescriptionFragment()
所以它被創建并在開始時嘗試決議包
val bundle: Bundle? = this.getArguments();
val position: Int = bundle!!.getInt("position", 0)
尚未設定,您將在Fragment
創建后的下一行執行此操作。但是您一開始就被迫從 bundle ( !!
) 中讀取,就null
在此時,所以NullPointerException
發生了
您的方法是錯誤的,您應該在某些生命周期方法中讀取引數,例如onCreate
or onCreateView
,當您Fragment
創建、設定(例如Bundle
引數集)、添加到布局和運行時(因為它正在呼叫生命周期方法)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507357.html
標籤:安卓 科特林 安卓片段 android-recyclerview 空指针异常
上一篇:為什么要在ViewModel(Android)中進行網路呼叫?
下一篇:修改后如何訪問變數