当前位置: 首页 > 知识库问答 >
问题:

适配器不显示来自Firebase实时数据库的产品图像和价格

谢阳成
2023-03-14

我正在尝试从Firebase实时数据库中检索数据(产品图像和价格)并将其放入回收器视图中,但我有一些困难。在我的数据库中,我存储了一个产品的图像url,我想在放置在cardView中的ImageView组件中显示该图像。我还设法正确检索了url和价格,但我的回收器视图没有显示它们。这是我的产品类:

public class CustomizeProduct {
    private String productImage;
    private String productName;
    private String productPrice;

    public CustomizeProduct(String image, String name, String price){
        this.productImage = image;
        this.productName = name;
        this.productPrice = price;
    }

    public String getProductImage() {
        return productImage;
    }
    public void setProductImage(String productImage){
        this.productImage = productImage;
    }

    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName){
        this.productName = productName;
    }

    public String getProductPrice() { return productPrice; }
    public void setProductPrice(String productPrice) {
        this.productPrice = productPrice;
    }
}

我的适配器如下:

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> {
    private ArrayList<CustomizeProduct> customized;
    private Context myContext;

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView thisProductImage;
        public TextView thisProductName;
        public TextView thisProductPrice;

        public ViewHolder(View itemView) {
            super(itemView);
            thisProductImage = itemView.findViewById(R.id.customProductImage);
            thisProductName = itemView.findViewById(R.id.customProductName);
            thisProductPrice = itemView.findViewById(R.id.customProductPrice);
        }
    }

    public ProductAdapter(Context context, ArrayList<CustomizeProduct> thisCustom) {
        myContext = context;
        customized = thisCustom;
    }

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.ingredients, parent, false);
        ViewHolder mv = new ViewHolder(v);
        return mv;
    }

    public void onBindViewHolder(ViewHolder holder, int position) {
        CustomizeProduct currentCustom = customized.get(position);
        Picasso.get().load(currentCustom.getProductImage()).placeholder(R.drawable.shrimp_ditali).into(holder.thisProductImage);
        holder.thisProductName.setText(currentCustom.getProductName());
        holder.thisProductPrice.setText(currentCustom.getProductPrice());
    }

    public int getItemCount() {
        return customized.size();
    }
}

我在我的recyclerView中放置的活动:

public class BuildProduct extends AppCompatActivity {
    public final static ArrayList<CustomizeProduct> customized = new ArrayList<>();
    private RecyclerView recyclerView;
    private ProductAdapter myAdapter;
    private RecyclerView.LayoutManager layoutManager;
    private static String productImage, productPrice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_build_product);

        buildCustom();
    }

    public void buildCustom(){
        recyclerView = findViewById(R.id.customList);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);

        final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("MENIU");
        ref.addListenerForSingleValueEvent(new ValueEventListener(){
            public void onDataChange(DataSnapshot ds) {
                for (DataSnapshot menu : ds.getChildren()) {
                    String keys = menu.getKey();
                    String productName = (String) ds.child(keys).child("NUME_PRODUS").getValue();
                    if(productName.equals(checkout.thisProductName)){
                        productImage = ds.child(keys).child("IMAGINE").getValue(String.class);
                        Long price = (Long) ds.child(keys).child("PRET_PRODUS").getValue();
                        productPrice = String.valueOf(price);
                        Toast.makeText(getApplicationContext(), productImage + " " + productPrice, Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        for(int i = 0; i < checkout.thisProductQty; i++) {
            customized.add(new CustomizeProduct(productImage,checkout.thisProductName, productPrice));
            myAdapter = new ProductAdapter(getApplicationContext(), customized);
        }
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(myAdapter);
    }
}

产品名称是正确的,因为它是一个变量,但图像和价格根本不会改变。“for”循环用于创建与我的该类型产品处于结帐状态一样多的卡视图。如何使其显示数据库中的图像和价格?

这是我的Firebase子结构:

编辑更新代码

public class CustomizeProduct {
    private String imagine;
    private String nume_produs;
    private String pret_produs;

    public CustomizeProduct(){}

    public CustomizeProduct(String imagine, String nume_produs, String pret_produs){
        this.imagine = imagine;
        this.nume_produs = nume_produs;
        this.pret_produs = pret_produs;
    }
    @PropertyName("IMAGINE")
    public String getIMAGINE() {
        return imagine;
    }
    @PropertyName("NUME_PRODUS")
    public String getNUME_PRODUS() {
        return nume_produs;
    }
    @PropertyName("PRET_PRODUS")
    public String getPRET_PRODUS() { return pret_produs; }

}

在onBindViewHolder中:

public void onBindViewHolder(ViewHolder holder, int position) {
        CustomizeProduct currentCustom = customized.get(position);
        Picasso.get().load(currentCustom.getIMAGINE()).placeholder(R.drawable.shrimp_ditali).into(holder.thisProductImage);
        holder.thisProductName.setText(currentCustom.getNUME_PRODUS());
        holder.thisProductPrice.setText(currentCustom.getPRET_PRODUS());
    }

共有2个答案

逑何平
2023-03-14

我认为您可能还需要注释私有字段,因为SDK使用这些字段来设置数据库中的值:

public class CustomizeProduct {
    @PropertyName("IMAGINE")
    private String imagine;
    @PropertyName("NUME_PRODUS")
    private String nume_produs;
    @PropertyName("PRET_PRODUS")
    private String pret_produs;

    public CustomizeProduct(){}

    public CustomizeProduct(String imagine, String nume_produs, String pret_produs){
        this.imagine = imagine;
        this.nume_produs = nume_produs;
        this.pret_produs = pret_produs;
    }
    @PropertyName("IMAGINE")
    public String getIMAGINE() {
        return imagine;
    }
    @PropertyName("NUME_PRODUS")
    public String getNUME_PRODUS() {
        return nume_produs;
    }
    @PropertyName("PRET_PRODUS")
    public String getPRET_PRODUS() { return pret_produs; }
}

注意,使用getter和setter是完全可选的,您还可以使用这个(短得多)类绑定到相同的JSON结构:

public class CustomizeProduct {
    @PropertyName("IMAGINE")
    public String imagine;

    @PropertyName("NUME_PRODUS")
    public String nume_produs;

    @PropertyName("PRET_PRODUS")
    public String pret_produs;
}
荀子轩
2023-03-14

< code > customized . add(new customize product(product image,checkout.thisProductName,product price));

您只能看到产品名称(结帐.this产品名称),而看不到产品图像

现在产品图片

public void buildCustom(){
    recyclerView = findViewById(R.id.customList);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("MENIU");
    ref.addListenerForSingleValueEvent(new ValueEventListener(){
        public void onDataChange(DataSnapshot ds) {
            for (DataSnapshot menu : ds.getChildren()) {
                String keys = menu.getKey();
                String productName = (String) ds.child(keys).child("NUME_PRODUS").getValue();
                if(productName.equals(checkout.thisProductName)){
                    productImage = ds.child(keys).child("IMAGINE").getValue(String.class);
                    Long price = (Long) ds.child(keys).child("PRET_PRODUS").getValue();
                    productPrice = String.valueOf(price);
                    Toast.makeText(getApplicationContext(), productImage + " " + productPrice, Toast.LENGTH_LONG).show();
                }
            }

            // here you've received all Firebase data and can now build the recyclerView
            for(int i = 0; i < checkout.thisProductQty; i++) {
                customized.add(new CustomizeProduct(productImage,checkout.thisProductName, productPrice));
                myAdapter = new ProductAdapter(getApplicationContext(), customized);
            }
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setAdapter(myAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}
 类似资料:
  • 我是Android的新手,我正在做一个应用程序,可以显示用户上传的衣服图片。我可以完美地上传图片,但由于某种原因,我无法将firebase实时数据库中的图像显示到中。几周来我一直在寻找解决办法。 请帮帮我。非常感谢你抽出时间。 topactivity.java 下面是我在TopsActivity.java中所做的更改

  • 我有一个列表中保存的改造响应。我试图将适配器连接到回收器视图,以显示响应中的数据。我设法将适配器连接到回收器视图,但实际上我看不到任何显示在回收器视图中的数据。响应很好,我可以毫不费力地记录它。 适配器 主要活动 模型 Api响应

  • 问题内容: 此代码将图片test.gif放入图片位值中。 我的下一个目标是显示以字节为单位保存在数据库中的图片。如何才能做到这一点 ? 问题答案: 就像是: 可能为您工作。

  • 应用程序运行良好...只是数据没有出现...我已经添加了sha用户电子邮件显示在登录后,在登录活动中我已经添加了 但是在实时数据库数据不显示以防万一…我也等了半个小时,尝试了所有的东西…网络也不错。数据库中的数据库规则的数据库图片 mainActivity.java//不能用于单个子级,即firebaseDatabase.getInstance().getReference().child(“aj

  • 我正在尝试为一个活动构建一个票务预订应用程序,我设法完成了注册和登录部分。登录后,用户配置文件会显示出来,其中包含一些关于姓名、年龄、电子邮件等的文本视图。我想从实时数据库中读取数据并将其放入文本视图中。我不知道问题出在哪里,但文本视图不会显示数据。 用户配置文件类 用户类