Фрагмент не связан с менеджером фрагментов

#android #firebase #kotlin #android-recyclerview

#Android #firebase #kotlin #android-recyclerview

Вопрос:

Этот вопрос задавался несколько раз, но предлагаемые решения не работают в моем конкретном случае.

При выполнении функции onProjectImageViewClick я получаю следующую ошибку:

 java.lang.IllegalStateException: Fragment HomeFragment{191080d} (9545b64c-bf0a-4464-8a71-b8c474526181)} not associated with a fragment manager.
  

Одним из предложенных решений было использование приведенного ниже кода для навигации, но поскольку мой фрагмент отсоединен, я не могу перейти к другому фрагменту.

 view?.post {
findNavController().navigate(R.id.fragment_project_info)
  

}

Кроме того, когда я устраняю неполадки с помощью println(Homefragment().isAdded) , он возвращает false, поэтому я не могу использовать решение, написанное выше.

Перед внедрением базы данных firebase (используя только заполнители для моего recyclerview), я мог бы перейти к моему fragment_project_info.

Мой фрагмент:

 class HomeFragment : Fragment(), HomeProjectListAdapter.OnItemClickListener {

private lateinit var auth: FirebaseAuth
private lateinit var databaseReference: DatabaseReference
lateinit var listener: ValueEventListener

var recentPostRef = FirebaseDatabase.getInstance().getReference("projects").limitToLast(50)

val TAG = "loadPostData Result"

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_home, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    auth = Firebase.auth

}
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    postQueryValueListener()
}

override fun onStart() {
    super.onStart()
    val currentUser = auth.currentUser
    updateUI(currentUser)
}

override fun onProjectImageViewClick(position: Int, projectData: ProjectData) {
    findNavController().navigate(R.id.fragment_project_info)

}

private fun updateUI(currentUser: FirebaseUser?){
    if(currentUser == null){
        upload_button.visibility = View.GONE
        projects_button.visibility = View.GONE

    }
}

private fun postQueryValueListener() {
    listener = recentPostRef.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            for (postSnapshot in dataSnapshot.children) {
                var list = ArrayList<ProjectData>()
                for (dataSnapshot1 in dataSnapshot.children) {
                    val p: ProjectData? = dataSnapshot1.getValue(ProjectData::class.java)
                    if (p != null) {
                        list.add(p)
                    }
                }
                var adapter = HomeProjectListAdapter(list, HomeFragment())
                recycler_view.adapter = adapter
                recycler_view.layoutManager = LinearLayoutManager(context)
                recycler_view.hasFixedSize()
            }
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        }
    })
}

override fun onStop() {
    super.onStop()
    recentPostRef.removeEventListener(listener)
}
  

}

Вот мой адаптер:

 class HomeProjectListAdapter(
    private val projectList: List<ProjectData>,
    private val listener: HomeFragment
) : RecyclerView.Adapter<HomeProjectListAdapter.ProjectListViewHolder>() {
    val TAG = "loadUserData Result"

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProjectListViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.layout_project_card,
        parent, false)

        return ProjectListViewHolder(itemView)

    }

    override fun onBindViewHolder(holder: ProjectListViewHolder, position: Int) {
        val currentItem = projectList[position]

        Glide.with(holder.projectImageView.context)
            .load(currentItem.mainImageURL)
            .into(holder.projectImageView)
    }

    override fun getItemCount() = projectList.size

    inner class ProjectListViewHolder(itemView: View): RecyclerView.ViewHolder(itemView),
    View.OnClickListener{
        var projectImageView: ImageView = itemView.project_card_image

        init {
            projectImageView.setOnClickListener(this)
        }
        override fun onClick(v: View?) {
            val position = adapterPosition
            val projectData: ProjectData = projectList[position]
            if (position != RecyclerView.NO_POSITION){
                if (v != null) {
                    if(v.id == R.id.project_card_image) {
                        listener.onProjectImageViewClick(position, projectData)
                    }
                }
            }
        }
    }

    interface OnItemClickListener {
        fun onProjectImageViewClick(position: Int, projectData: ProjectData)
    }
}  

Ответ №1:

При запуске вы HomeProjectListAdapter(list, HomeFragment()) передаете совершенно новый экземпляр HomeFragment . Этот совершенно новый экземпляр никогда не привязывается к FragmentManager.

Вместо этого вам нужно передать ваш текущий экземпляр фрагмента:

 var adapter = HomeProjectListAdapter(list, this@HomeFragment)