【问题标题】:Unable to get nested data from Firestore and display it in a Recyclerview无法从 Firestore 获取嵌套数据并将其显示在 Recyclerview 中
【发布时间】:2021-05-05 04:32:02
【问题描述】:

场景

这里的实际编程绝对是菜鸟,尝试自己构建应用程序,边写代码边学习。

我有一个文件,下面有一个交易清单。这是我的data structure

Collection: Transactions
 -> Document: Jan2021
   -> Map: <"transactions", ArrayList(Transaction[amount: String, date: Timestamp, description: String, type: String])>

要求

我想在卡片上显示交易的描述、日期和金额(“交易”数据类的一部分)。

问题

我无法(或者可能不知道如何执行此操作)获取数据并将其显示在 AlertDialog 中,更不用说获取数据并将其映射到系统中的对象了。

正在使用的代码

自定义数据类

data class TransactionDocument (
    var Document: HashMap<String, Any> = hashMapOf()
)

主要活动

val query: Query = traRef.whereEqualTo(FieldPath.documentId(), currentMonth)
val options =
    FirestoreRecyclerOptions.Builder<TransactionDocument>()
    .setQuery(query, TransactionDocument::class.java)
    .build()

val arr_trans: fb_adpt_transaction? = fb_adpt_transaction(options)

[...]

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

override fun onStop() {
    super.onStop()

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

适配器类

class fb_adpt_transaccion constructor(transactionsList: FirestoreRecyclerOptions<TransactionDocument>):
    FirestoreRecyclerAdapter<TransactionDocument, fb_adpt_transaccion.TransactionViewHolder>(transactionsList)
{
    inner class TransactionsViewHolder constructor(private val view: View) : RecyclerView.ViewHolder(view) {

        fun displayValues(transaction: TransactionDocument, position: Int) {
            AlertDialog.Builder(this.view.context).setMessage(transaction.toString()).show()
        }
    }

    override fun onBindViewHolder( transactionViewHolder: fb_adpt_transaccion.TransactionsViewHolder,
        position: Int,modelo: TransactionDocument)
    {
        transactionViewHolder.mostrarValores(modelo, position)
    }

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

到目前为止我测试过的内容

如果我在 MainActivity 中尝试以下代码,显示的结果是正确的,但我无法在适配器中完成这项工作:

query.get().addOnSuccessListener {
    val message = it.documents[0]["transactions"].toString()

    AlertDialog.Builder(this).setMessage(message).show()
}

此外,我测试了将数据类“TransactionDocument”(如上所示)更改为 Map,而不是 HashMap。我也尝试过发送 DocumentSnapshot(这不起作用,而且是错误的)。

感谢任何帮助!

【问题讨论】:

    标签: android firebase kotlin android-recyclerview google-cloud-firestore


    【解决方案1】:

    代码中的问题在于文档中的“事务”属性不是 Map,实际上是“事务”对象的数组。如果您想将该数组映射到自定义对象列表中,可以查看我已解释的以下文章:

    How to map an array of objects from Cloud Firestore to a List of objects?

    在您的情况下,只需创建一个类:

    class TransactionDocument {
        public List<Transaction> transactions;
    }
    

    并使用以下方法获取相应的列表:

    transactionIdRef.get().addOnCompleteListener(task -> {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                List<Transaction> transactions = document.toObject(TransactionDocument.class).transactions;
                //Use the the list
            }
        }
    });
    

    【讨论】:

    • 您能否在答案中包含实现问题目标的代码以使其独立?
    • @Happy-Monad 当然,刚刚更新了我的答案。好点,谢谢。
    • @AlexMamo 我实际上在另一个标签中打开了您的文章。我的假设是我可以使用 FirestoreRecyclerAdapter,我理解这是不正确的。我将改用常规的 RecyclerView 适配器,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2019-04-12
    • 2019-10-10
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多