[英]Can't pass data from recyclerview adapter to another kotlin fragment
[英]Can't launch Fragment from RecyclerView adapter
NameListHolder class 的代码位于 RecyclerView 适配器中
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
:
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
指向DescriptionFragment
片段内的字符串val position: Int = bundle.,.getInt("position", 0)
NameListAdapter.kt:49
指向NameListHolder
内的val fragment = DescriptionFragment()
行
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>
您正在此行中创建新片段
val fragment = DescriptionFragment()
所以它被创建并在开始时尝试解析包
val bundle: Bundle? = this.getArguments();
val position: Int = bundle!!.getInt("position", 0)
尚未设置,您将在Fragment
创建后的下一行执行此操作。 但是您一开始就强制从捆绑包( !!
)中读取,此时它是null
,因此发生NullPointerException
您的方法是错误的,您应该在诸如onCreate
或onCreateView
之类的生命周期方法中阅读 ZDBC11CAA5BDA99F77E7DZ ,当您确定已创建Fragment
时,已设置(例如Bundle
arguments 集),添加到布局并运行(因为它正在调用生命周期方法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.