# #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()
своему адаптеру, чтобы сообщить ему об изменении списка.