kotlin:未附加片段,无法示例化调用片段常量的片段导致异常

idv4meu8  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(323)

我正在尝试将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)声明中,仍然会得到错误。

wb1gzix0

wb1gzix01#

您应该将回调传递给 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()
    }

}

相关问题