Проблема с Kotlin Firebase RecyclerView

# #android #firebase #kotlin #android-recyclerview #fragment

Вопрос:

Я пытаюсь создать пользовательский recyclerview во фрагменте, но я не могу заставить его работать.

Идея состоит в том, чтобы получить пользователей из базы данных (за исключением фактического пользователя, вошедшего в систему) и добавить пользовательские данные в список. Проблема в том, что список даже не появляется.

Я мало что знаю о Котлине, я недавно начал, и я борюсь с этим. Кроме того, я не знаю, в чем проблема.

Если вам нужен XML, попросите его

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

 import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.database.*


@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
class UsersFragment:Fragment(R.layout.fragment_users) {

    private lateinit var recyclerView: RecyclerView
    private lateinit var adapterUsers: AdapterUsers
    private lateinit var userList: MutableList<ModelUsers>

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        super.onCreate(savedInstanceState)
        (activity as AppCompatActivity).supportActionBar?.title = "Users"
    val view: View = inflater.inflate(R.layout.fragment_users, container, false)

    userList = ArrayList()

    getAllUsers()

    adapterUsers = AdapterUsers(context!!, userList)

    recyclerView = view.findViewById(R.id.users_recyclerView)
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
    recyclerView.adapter = adapterUsers

    return view
}

private fun getAllUsers() {
    val fUser: FirebaseUser = FirebaseAuth.getInstance().currentUser
    val ref: DatabaseReference = FirebaseDatabase.getInstance().getReference("Users")

    ref.addValueEventListener(object: ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            Log.d("FUNCTION", "ENTER")
            userList.clear()
            for(ds: DataSnapshot in snapshot.children){
                val modelUsers: ModelUsers? = ds.getValue(ModelUsers::class.java)

                if(!modelUsers?.uid.equals(fUser.uid)){
                    userList.add(modelUsers!!)
                    Toast.makeText(activity, "IN", Toast.LENGTH_SHORT).show()
                }
            }
        }

        override fun onCancelled(error: DatabaseError) {
            TODO("Not yet implemented")
        }

    })
}

companion object {
    fun newInstance(): ProfileFragment {
        return ProfileFragment()
    }}}
 

Мой Пользовательский Адаптер:

 import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import java.lang.Exception

open class AdapterUsers(private var context:Context, private var userList: MutableList<ModelUsers> = mutableListOf<ModelUsers>()): RecyclerView.Adapter<AdapterUsers.UserViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.row_users, parent, false)
        return UserViewHolder(view)
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        val userImage = userList[position].image
        val userName = userList[position].name
        val userEmail = userList[position].email

        holder.mNameTv.text = userName
        holder.mEmailTv.text = userEmail
        try {
            Picasso.get().load(userImage).placeholder(R.drawable.ic_default_image_color).into(holder.mAvatarIv)
        }
        catch (e: Exception){

        }

        holder.itemView.setOnClickListener{
            Toast.makeText(context, userEmail, Toast.LENGTH_SHORT).show()
        }
    }

    override fun getItemCount(): Int {
        return userList.size
    }

    inner class UserViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
        val mAvatarIv: ImageView = itemView.findViewById(R.id.avatarIv)
        val mNameTv: TextView = itemView.findViewById(R.id.nameTv)
        val mEmailTv: TextView = itemView.findViewById(R.id.emailTv)
    }
}
 

Модель для пользователей:

 data class ModelUsers(
var name: String? = null,
var email: String? = null,
var search: String? = null,
var phone: String? = null,
var image: String? = null,
var cover: String? = null,
var uid: String? = null)
 

Ответ №1:

Вам следует обновить адаптер представления переработчика после изменения ваших данных, попробуйте изменить код следующим образом:

 class UsersFragment:Fragment(R.layout.fragment_users) {

    private lateinit var recyclerView: RecyclerView
    
    private var userList = mutableListOf<ModelUsers>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        super.onCreate(savedInstanceState)
        (activity as AppCompatActivity).supportActionBar?.title = "Users"
        val view: View = inflater.inflate(R.layout.fragment_users, container, false)

        recyclerView = view.findViewById<RecyclerView>(R.id.users_recyclerView).apply {
            setHasFixedSize(true)
            layoutManager = LinearLayoutManager(requireContext())
            adapter = AdapterUsers(requireContext(), mutableListOf())
        }

        getAllUsers()

        return view
    }

    private fun getAllUsers() {
        val fUser: FirebaseUser = FirebaseAuth.getInstance().currentUser
        val ref: DatabaseReference = FirebaseDatabase.getInstance().getReference("Users")

        ref.addValueEventListener(object: ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                Log.d("FUNCTION", "ENTER")
                userList.clear()

                for(ds: DataSnapshot in snapshot.children) {
                    val modelUsers: ModelUsers? = ds.getValue(ModelUsers::class.java)

                    if(!modelUsers?.uid.equals(fUser.uid)){
                        userList.add(modelUsers!!)
                        Toast.makeText(activity, "IN", Toast.LENGTH_SHORT).show()
                    }

                    recyclerView.adapter = AdapterUsers(requireContext(), userList)
                }
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }

        })
    }

    companion object {
        fun newInstance(): ProfileFragment {
            return ProfileFragment()
        }
    }
}
 

Комментарии:

1. Это сработало, спасибо тебе, очень, очень спасибо. Ты действительно спас меня

Ответ №2:

Проблема в том, что при использовании адаптера список пуст, а затем, возможно, через 0,2 секунды вы извлекли пользователей из базы данных и заполнили список, но адаптер не знает, что список изменился. После заполнения списка вы можете позвонить notifyDataSetChanged() своему адаптеру, чтобы сообщить ему об изменении списка.