繁体   English   中英

无法从 RecyclerView 适配器启动 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:0Unknown 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

您的方法是错误的,您应该在诸如onCreateonCreateView之类的生命周期方法中阅读 ZDBC11CAA5BDA99F77E7DZ ,当您确定已创建Fragment时,已设置(例如Bundle arguments 集),添加到布局并运行(因为它正在调用生命周期方法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM