有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Kotlin:未附加片段,无法实例化调用片段常量的片段导致异常

我正在尝试将childFragmentManager从片段传递到适配器。当前片段是从不同的片段而不是活动调用的

fragment类有一个val

class DisplaySchoolFrag : BaseFragment<binding, DisplaySchoolViewModel>{
...

private val adapter = DisplaySchoolAdapter(childFragmentManager)

在适配器中,我只有childFrag的const声明,目前没有其他用法

class DisplaySchoolAdapter(childFrag: FragmentManager) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

我需要适配器中的childFragmentManager,因为在适配器类中有一个按钮,它指向底部的片段

FragmentHostCallback<?> mhost
getChildFrar(){
if (this.mHost == null) {
            throw new IllegalStateException("Fragment " + this + " has not been attached yet.");

这一行导致片段未附加,无法实例化调用Fragment const引起异常的片段

我试过这个

lateinit var childFrag : FragmentManager


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
         childFrag = childFragmentManager
        return super.onCreateView(inflater, container, savedInstanceState)
    }

并且将childFrag传递到DisplaySchoolAdapter(childFrag)声明中,仍然会得到错误


共 (1) 个答案

  1. # 1 楼答案

    您应该将回调传入DisplaySchoolAdapter,并重写单个项的setOnClickListener侦听器并调用回调

    class DisplaySchoolAdapter(lambdaToBeInvoked: () -> Unit): RecyclerView.Adapter<SomeViewHolder>() {
    
       ... set up your adapter
    
       override fun onBindViewHolder(holder: SomeViewHolder, position: Int) {
         val item = items[position]
         holder.bind(item)
         holder.itemView.setOnClickListener { lambdaToBeInvoked() }
       }
    }
    

    您可以在适配器的其余部分中填写实现细节,但是onBindViewHolder是调用回调的地方。如果您需要向其中传递任何参数,那么可以在实现中随意添加这些参数

    然后在片段中,当您实例化适配器时,您将传入您希望childFragment执行的操作

    class YourFragment: FragmentActivity() {
     
        override onCreate() {
             
             val adapter = DisplaySchoolAdapter {
                  // have your childFragment navigate to somewhere
             }
    
             recyclerView.adapter = adapter
             recyclerView.layoutManager = LinearLayoutManager()
        }
    
    }