You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin实现Firestore订单文档的点击展示功能

实现Firestore订单生成按钮并点击展示详情

1. 调整布局文件(activity_admin_orders.xml)

先给布局添加一个可滚动的容器,用来承载动态生成的订单按钮:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/order_buttons_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp"
        android:gap="8dp">

    </LinearLayout>
</ScrollView>

2. 修改AdminOrders.kt代码

优化Firestore监听逻辑,动态生成按钮并绑定点击事件:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Window
import android.widget.Button
import android.widget.LinearLayout
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase

class AdminOrders : AppCompatActivity() {
    private lateinit var orderButtonsContainer: LinearLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE)
        supportActionBar?.hide()
        setContentView(R.layout.activity_admin_orders)

        // 初始化按钮容器
        orderButtonsContainer = findViewById(R.id.order_buttons_container)
        val db = Firebase.firestore

        // 监听Orders集合的实时数据变化
        db.collection("Orders").addSnapshotListener { snapshot, e ->
            if (e != null) {
                Toast.makeText(this, "获取订单失败: ${e.message}", Toast.LENGTH_SHORT).show()
                return@addSnapshotListener
            }

            snapshot?.let {
                // 先清空旧按钮,避免重复添加
                orderButtonsContainer.removeAllViews()

                // 遍历每个订单文档生成按钮
                for (document in it.documents) {
                    val orderData = document.data ?: continue
                    // 用食物名称作为按钮文本,没有则用订单ID
                    val buttonText = orderData["food"].toString().takeIf { it.isNotEmpty() } ?: "订单 ${document.id}"

                    // 创建按钮并配置属性
                    val orderButton = Button(this).apply {
                        text = buttonText
                        layoutParams = LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT
                        )
                        // 设置点击事件,展示订单完整信息
                        setOnClickListener {
                            // 拼接所有字段信息
                            val detailContent = StringBuilder().apply {
                                orderData.forEach { (key, value) ->
                                    append("$key: $value\n")
                                }
                            }

                            // 用AlertDialog展示详情(比Toast更清晰)
                            AlertDialog.Builder(this@AdminOrders)
                                .setTitle("订单 ${document.id} 详情")
                                .setMessage(detailContent.toString())
                                .setPositiveButton("关闭", null)
                                .show()
                        }
                    }

                    // 将按钮添加到容器中
                    orderButtonsContainer.addView(orderButton)
                }
            }
        }
    }
}

关键说明

  • 移除冗余请求:原代码中snapshotListener已能获取集合最新数据,无需再调用get(),避免重复请求Firestore。
  • UI同步更新:每次集合数据变化时先清空旧按钮,再重新生成,保证UI和数据一致。
  • 详情展示优化:用AlertDialog替代Toast展示订单信息,更适合查看多字段内容。
  • 容错处理:判断文档数据是否为空,避免空指针异常;添加错误提示,方便调试。

内容的提问来源于stack exchange,提问作者goAT2160

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:07:46