#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)