【问题标题】:How to populate RecyclerView with data from Firebase Database如何使用 Firebase 数据库中的数据填充 RecyclerView
【发布时间】:2023-03-27 03:48:01
【问题描述】:

我正在尝试使用我的 firebase 数据库中的数据填充我的 recyclerview。我对这些东西很陌生。我看了一些教程,但仍然无法做到。 这是我的费用项目类。我正在使用 GroupieViewHolder。

class ExpenseItems(val title: String, val date:String, val value:String, val description:String, val category: String): Item<GroupieViewHolder>() {
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        viewHolder.itemView.expenseTitleTextView.text = title
        viewHolder.itemView.expenseDateTextView.text = date
        viewHolder.itemView.expenseItemValue.text = value
        viewHolder.itemView.descriptionText.text = description
        viewHolder.itemView.expenselistCategory.text = category
    }

    override fun getLayout(): Int {
        return R.layout.expenselist
    }

}

这是我拥有的 Firebase 代码。我在 logcat 上获得了有关当前用户费用的信息,但我不知道如何将它们放在适配器上。


    private fun getCurrentUserExpenses(){
        val uid = FirebaseAuth.getInstance().currentUser!!.uid
        val reference = FirebaseDatabase.getInstance().getReference("users").child(uid).child("Expenses")
        reference.addListenerForSingleValueEvent(object : ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                val adapter = GroupAdapter<GroupieViewHolder>()
                snapshot.children.forEach{
                    Log.d("Expense items",it.toString())
                }
            }
            override fun onCancelled(error: DatabaseError) {
            }

        })

    }

这是我的费用清单布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/expenseItem"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="@drawable/expenselist_background">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/expensListImageView"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_marginLeft="1dp"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="8dp"
        android:src="@drawable/renting"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <TextView
        android:id="@+id/expenseTitleTextView"
        android:layout_width="88dp"
        android:layout_height="18dp"
        android:layout_marginStart="12dp"
        android:layout_marginTop="4dp"
        android:fontFamily="@font/regular"
        android:text="Expense title"
        android:textColor="@color/white"
        android:textSize="13dp"
        app:layout_constraintStart_toEndOf="@+id/expensListImageView"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/expenseDateTextView"
        android:layout_width="wrap_content"
        android:layout_height="12dp"
        android:layout_marginStart="12dp"
        android:layout_marginTop="4dp"
        android:fontFamily="@font/poppinsextralight"
        android:text="Date"
        android:textColor="@color/white"
        android:textSize="9dp"
        app:layout_constraintStart_toEndOf="@+id/expensListImageView"
        app:layout_constraintTop_toBottomOf="@+id/expenseTitleTextView" />

    <TextView
        android:id="@+id/expenseItemValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/medium"
        android:text="$999"
        android:textColor="@color/white"
        android:textSize="13dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.465" />

    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="1dp"
        android:layout_marginTop="10dp"
        android:fontFamily="@font/regular"
        android:text="Description:"
        android:textColor="@color/white"
        android:textSize="13dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/expensListImageView" />

    <TextView
        android:id="@+id/descriptionText"
        android:layout_width="33dp"
        android:layout_height="15dp"
        android:layout_marginStart="4dp"
        android:fontFamily="@font/poppinsextralight"
        android:text="TextView"
        android:textColor="@color/white"
        android:textSize="9dp"
        app:layout_constraintBottom_toBottomOf="@+id/description"
        app:layout_constraintStart_toEndOf="@+id/description"
        app:layout_constraintTop_toTopOf="@+id/description" />

    <TextView
        android:id="@+id/expenselistCategory"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="4dp"
        android:layout_marginTop="6dp"
        android:fontFamily="@font/poppinslight"
        android:text="Category"
        android:textColor="@color/white"
        android:textSize="11dp"
        app:layout_constraintStart_toEndOf="@+id/expenseTitleTextView"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

这是我的数据库

提前谢谢你

编辑

这就是我现在所做的。我几乎修复了它,但有一个小问题。这是我的 getCurrentUserExpenses 函数的样子。

 private fun getCurrentUserExpenses(){
        val uid = FirebaseAuth.getInstance().currentUser!!.uid
        val reference = FirebaseDatabase.getInstance().getReference("/users").child(uid).child("Expenses").child("2021").child("May")
        reference.addValueEventListener(object : ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                val adapter = GroupAdapter<GroupieViewHolder>()
                snapshot.children.forEach{
                    val expenses = it.getValue(AddedExpense::class.java)
                    Log.d("Expense items",it.toString())
                    if (expenses!=null){
                        adapter.add(ExpenseItems(expenses))
                    }
                }
                expensesRecylerView.adapter=adapter
            }
            override fun onCancelled(error: DatabaseError) {
            }
        })

    }

有了这个,我只能得到一个月的费用。我希望显示当前用户的所有费用。当我使用 FirebaseDatabase.getInstance().getReference("/users").child(uid).child("Expenses") 时,它只显示 1 项,我猜它是 2021 节点。

我也对 ExpenseItems 类进行了更改

class ExpenseItems(val addedExpense:AddedExpense): Item<GroupieViewHolder>() {
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {

        viewHolder.itemView.expenseTitleTextView.text = addedExpense.itemName
        viewHolder.itemView.expenseDateTextView.text = addedExpense.itemDate
        viewHolder.itemView.expenseItemValue.text = addedExpense.itemValue
        viewHolder.itemView.descriptionText.text = addedExpense.itemDesc
        viewHolder.itemView.expenselistCategory.text = addedExpense.itemCategory
    }

    override fun getLayout(): Int {
        return R.layout.expenselist
    }

}

这也是我的 AdditionalExpense 类

@Parcelize
 class AddedExpense(val itemName:String, val itemDesc:String,val itemCategory:String,val itemValue:String,val itemDate:String):Parcelable{
     constructor(): this("","","","","")
 }

【问题讨论】:

标签: android firebase kotlin android-recyclerview


【解决方案1】:

在 Activity/Fragment 上初始化适配器。您的 Activity/Fragment xml 布局中应该有一个 Recyclerview 布局。

例如,如果您有 ExpensesAdapter

例如

<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager".../>

然后在您的 Fragment 中调用 onViewCreated 或在您的 Activity 中调用 onCreate,将您的初始化适配器设置为您的 recyclerview 适配器

例如

binding.myrecyclerview.adapter = ExpensesAdapter()

或在您的活动或片段中创建private var adapter

private var adapter = ExpensesAdapter()

然后

binding.myrecyclerview.adapter = adapter

所以在您的 ExpensesAdapter 上创建一个列表,您将在其中传递/更新/设置您的列表值

【讨论】:

  • 我对我的代码添加了一些更改。快完成了。我已经写了我在 EDIT 下所做的事情。你知道我该如何解决吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多