Firebase数据无法在Android应用中显示,寻求技术支持
修复Firebase数据在Android Cart页面不显示的问题
我看了你提供的代码,发现几个关键问题导致Firebase数据无法在Cart页面正常显示,咱们一步步来排查修复:
1. 修正Firebase数据结构不匹配问题
你现在在sunglass1.java里是直接把商品名称作为键、价格作为单一值存储的:
myRef.setValue("$64");
但你的cartitems实体类需要title和price两个字段的对象结构,所以得调整数据存储方式,让Firebase里的数据能和你的实体类对应上:
// 替换原来的myRef.setValue("$64"); HashMap<String, Object> product = new HashMap<>(); product.put("title", "Octagon Glasses"); product.put("price", "$64"); // 用push()生成唯一ID,避免重复添加时覆盖原有数据 database.getReference("cartItems").push().setValue(product);
调整后Firebase的数据结构会变成:
cartItems - 随机生成的唯一ID1 - title: "Octagon Glasses" - price: "$64" - 随机生成的唯一ID2 - ...
2. 修复cartitems.java的setPrice方法bug
你的setPrice方法参数名和赋值逻辑错误,会导致价格无法正确设置:
// 原来的错误代码 public void setPrice(String year) { this.price = price; } // 修改为 public void setPrice(String price) { this.price = price; }
3. 完善cart_list_row.xml布局
你当前的布局里没有为title和price定义带id的TextView,适配器找不到对应的控件,所以无法渲染数据:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:focusable="true" android:paddingBottom="@dimen/row_padding_vertical" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/row_padding_vertical"> <!-- 商品标题 --> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <!-- 商品价格 --> <TextView android:id="@+id/price" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/title" android:textSize="16sp" android:textColor="@android:color/darker_gray"/> </RelativeLayout>
4. 补全cart.java的核心逻辑(你没提供这个文件,这是关键!)
你需要在CartActivity里初始化RecyclerView,监听Firebase数据库的变化,把数据加载到列表中:
package edu.phoenix.mbl402.week2apptt2163; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.widget.Toast; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.List; public class cart extends AppCompatActivity { private RecyclerView recyclerView; private cartadapter adapter; private List<cartitems> cartItemsList; private DatabaseReference dbRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cart); // 初始化列表和RecyclerView cartItemsList = new ArrayList<>(); recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new cartadapter(cartItemsList); recyclerView.setAdapter(adapter); // 获取Firebase数据库引用 dbRef = FirebaseDatabase.getInstance().getReference("cartItems"); // 监听数据变化,实时更新列表 dbRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { cartItemsList.clear(); // 清空旧数据,避免重复加载 for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // 把Firebase数据转换成cartitems对象 cartitems item = snapshot.getValue(cartitems.class); cartItemsList.add(item); } adapter.notifyDataSetChanged(); // 通知适配器刷新数据 } @Override public void onCancelled(DatabaseError databaseError) { // 处理数据加载错误 Toast.makeText(cart.this, "加载数据失败: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
5. 检查Firebase数据库规则
因为你的应用没有用户认证,需要确保数据库允许所有用户读取数据。打开Firebase控制台的Realtime Database -> 规则,修改为测试用规则(正式上线前请根据需求调整权限,避免数据被恶意修改):
{ "rules": { ".read": true, ".write": true } }
做完这些修改后,重新运行应用,添加商品到Firebase,再打开Cart页面应该就能看到数据了。如果还有问题,可以查看Logcat里的错误信息,排查是否存在Firebase权限或者数据解析的问题。
内容的提问来源于stack exchange,提问作者Tanner Tattini
相关产品推荐
相关产品推荐

