Получить профили отображения с помощью UID на адаптере FirestoreRecycler с помощью Kotlin? - PullRequest
2 голосов
/ 29 октября 2019

У меня проблемы с получением информации из Firefase Firestore для моего адаптера Recycler. Я не уверен, что могу делать что-то не так, но я использовал Ссылку на документ, чтобы получить обязательное поле, но теперь оно, кажется, просто копирует одно и то же снова и снова, я хочу, чтобы он отображал каждый созданный профиль пользователя и отображал его в моем RecyclerAdapterно я не уверен, что мне следует делать и пробовал другие методы, но получаю

"Нет ошибки установщика / поля" в моем классе модели "Пользователи".

Это моя схема Firebase Это то, что она выводит

Это то, что у меня есть мой код до сих пор

[Обновить] Это то, что я импортировал

import Models.User
import android.content.Intent
import android.content.res.Configuration
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.firebase.ui.firestore.FirestoreRecyclerAdapter
import com.firebase.ui.firestore.FirestoreRecyclerOptions
import com.google.android.material.navigation.NavigationView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.*
import com.squareup.picasso.Picasso
import de.hdodenhof.circleimageview.CircleImageView
import kotlinx.android.synthetic.main.all_nearby_users.*
import kotlinx.android.synthetic.main.toolbar_layout.*

Создать

       auth = FirebaseAuth.getInstance()
        val customUserId = auth.currentUser!!.uid
        val db = FirebaseFirestore.getInstance()
        val userRef = db.collection("sUsers").document(customUserId)
        val userQuery = db.collection("sUsers").orderBy("Full Name", Query.Direction.DESCENDING).limit(10)

//User List Layout
        all_users_nearby_list.layoutManager = LinearLayoutManager(this)

        //Firestore
        val firestoreRecyclerOptions: FirestoreRecyclerOptions<Users> = FirestoreRecyclerOptions.Builder<Users>()
            .setQuery(userQuery, Users::class.java)
            .build()
        adapter = UserFirestoreRecyclerAdapter(firestoreRecyclerOptions)
        all_users_nearby_list.adapter = adapter

Адаптер Firestore Recycler

private inner class UserFirestoreRecyclerAdapter internal constructor
        (firestoreRecyclerOptions: FirestoreRecyclerOptions<Users>): FirestoreRecyclerAdapter<Users, UserViewHolder>(firestoreRecyclerOptions) {

            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
                val userView = LayoutInflater.from(parent.context)
                    .inflate(R.layout.display_users_profile, parent, false)

                return UserViewHolder(userView)
            }

            override fun onBindViewHolder(holder: UserViewHolder, position: Int, model: Users) {

                holder.setFullname(model.fullname)
                holder.setProfileimage(model.profileImage)

            }

        }

UserViewHolder


   private inner class UserViewHolder internal constructor (private val pView: View) : RecyclerView.ViewHolder(pView) {


        internal fun setFullname(fullname: String) {
            val username = pView.findViewById<TextView>(R.id.usernameTextView)
            val db = FirebaseFirestore.getInstance()
            val docRef = db.collection("sUsers").document(auth.currentUser!!.uid)
            docRef.get()
                .addOnSuccessListener { document ->
                    if (document != null) {
                        Log.d("HomeActivity", "DocumentSnapshot data: ${document.data}")
                        username.text = document.getString("Full Name")

                    } else {
                        Log.d("HomeActivity", "No such document")
                    }
                }
                .addOnFailureListener { exception ->
                    Log.d("HomeActivity", "get failed with ", exception)
                }


            username.text = fullname
            Log.d("HomeActivity", "Current Data: " + fullname)
        }

        internal fun setProfileimage(profileImage: String) {
            val userProfileImage = pView.findViewById<CircleImageView>(R.id.profileUserImage)
            Picasso.get().load(profileImage).into(userProfileImage)
        }

    }

Модель класса

package Models

    class Users(
    var fullname: String= "",
    var profileImage: String= "",
    var uid: String? = "",
    var haircut: Boolean? = null,
    var waxing: Boolean? = null,
    var nails: Boolean? = null,
    var profileRatingBar: Float? = 1.0f
)

Мой onStart и onStop


   override fun onStart() {
        super.onStart()
        adapter!!.startListening()
    }

    override fun onStop() {
        super.onStop()

        if (adapter != null) {
            adapter!!.stopListening()
        }
    }

1 Ответ

2 голосов
/ 29 октября 2019

Вот как бы я написал ваш RecyclerView. Ключевые моменты:

  • Не делайте 2-го запроса FireStore внутри ViewHolder
  • Ваша схема Firestore должна точно соответствовать вашей модели
  • Использовать владельца жизненного цикла вместо onStart / onStop
  • Пользовательский интерфейс Firebase не захватывает uid;так что сделайте это вручную (см. apply)
  • ViewHolder должен "держать" представления как поля (чтобы избежать вызова find каждый раз)
  • Модель представляет 1 объект, поэтому я называю его "Пользователь""not" Users "
  • Установить layoutManager в XML, чтобы уменьшить шаблон в onCreate

Layout XML

<androidx.recyclerview.widget.RecyclerView
    ...
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    tools:itemCount="5"
    tools:listitem="@layout/display_users_profile"
    ... />

ActivityonCreate

val query = FirebaseFirestore.getInstance()
    .collection("sUsers") // Why not "users" ?
    .orderBy("fullname", Query.Direction.DESCENDING)
    .limit(10)

val options = FirestoreRecyclerOptions.Builder<User>()
    .setLifeCycleOwner(this)
    .setQuery(query) { it.toObject(User::class.java)!!.apply { uid = it.id } }
    .build()

all_users_nearby_list.adapter = UserFirestoreRecyclerAdapter(options)

Адаптер

internal class UserFirestoreRecyclerAdapter(options: FirestoreRecyclerOptions<User>) : 
    FirestoreRecyclerAdapter<User, UserViewHolder>(options) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 
        LayoutInflater.from(parent.context)
            .inflate(R.layout.display_users_profile, parent, false)
            .let { UserViewHolder(it) }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int, model: Users) = 
        holder.bind(model)

}

ViewHolder

internal class UserViewHolder(itemView: View) : 
    RecyclerView.ViewHolder(itemView) {

    // Hold view refs
    private val usernameTextView: TextView = itemView.userNameTextView
    private val profileUserImage: ImageView = itemView.profileUserImage

    internal fun bind(model: User) {
        model.apply {
            usernameTextView.text = fullname
            Picasso.get().load(profileImage).into(profileUserImage)
        }
    }
}

Модель

// Set sensible defaults here (or null if no sensible default)
data class User(
    var uid: String = "",
    var fullname: String= "",
    var profileImage: String= "",
    var haircut: Boolean = false,
    var waxing: Boolean = false,
    var nails: Boolean = false,
    var profileRatingBar: Float? = null
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...