【问题标题】:Firebase model POJO getter returns null in FirebaseRecyclerAdapterFirebase 模型 POJO getter 在 FirebaseRecyclerAdapter 中返回 null
【发布时间】:2019-03-16 11:00:28
【问题描述】:

我有一个 FirebaseRecyclerAdapter 从 firebase 数据库中获取数据,但是当我尝试访问 firebase 数据时,POJO 的 getter 方法返回 null。我可以得到数据库引用键。

    final Query beveragesQuery = mDatabaseReference.child(FirebaseValues.PRODUCTS)
                    .child(FirebaseValues.BEVERAGES);
            FirebaseRecyclerOptions<GenericProductModel> beveragesOptions =
                    new FirebaseRecyclerOptions.Builder<GenericProductModel>()
                            .setQuery(beveragesQuery, GenericProductModel.class)
                            .build();
            adapter = new FirebaseRecyclerAdapter<GenericProductModel, Combos.MovieViewHolder>(
                    beveragesOptions
            ) {
                @NonNull
                @Override
                public Combos.MovieViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.cards_cardview_layout, parent, false);
                    return new Combos.MovieViewHolder(view);
                }

                @Override
                protected void onBindViewHolder(@NonNull Combos.MovieViewHolder viewHolder, int position, @NonNull GenericProductModel model) {
                    Log.d(TAG, "Item received:"+getRef(position).getKey());
String json = new Gson().toJson(model);
                Log.d(TAG, "Item received:"+ json);
                Log.d(TAG, "Item received:"+ model.toString());
                    if (tv_no_item.getVisibility() == View.VISIBLE) {
                        tv_no_item.setVisibility(View.GONE);
                    }
                    Log.d(TAG, "card name:"+model.getCardname());
                    viewHolder.cardname.setText(model.getCardname());
                    viewHolder.cardprice.setText("₹ " + Float.toString(model.getCardprice()));
                    Picasso.get().load(model.getCardimage()).into(viewHolder.cardimage);

                    viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(Beverages.this, IndividualProduct.class);
                            intent.putExtra("product", getItem(position));
                            startActivity(intent);
                        }
                    });
                }
                @Override
                public void onError(DatabaseError e) {
                    Log.e(TAG, "RV Adapter, Error occurred: " + e.getMessage());
                }
                };
            mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

            mRecyclerView.setLayoutManager(mLayoutManager);
            adapter.startListening();
            mRecyclerView.setAdapter(adapter);
        }

我的 POJO 或模型类是

public class GenericProductModel implements Serializable {

    public int cardid;
    public String cardname;
    public String cardimage;
    public String carddescription;
    public float cardprice;

    public GenericProductModel() {
    }

    public GenericProductModel(int cardid, String cardname, String cardimage, String carddescription, float cardprice) {
        this.cardid = cardid;
        this.cardname = cardname;
        this.cardimage = cardimage;
        this.carddescription = carddescription;
        this.cardprice = cardprice;
    }

    public int getCardid() {
        return cardid;
    }

    public String getCardname() {
        return cardname;
    }

    public String getCardimage() {
        return cardimage;
    }

    public String getCarddescription() {
        return carddescription;
    }

    public float getCardprice() {
        return cardprice;
    }

    public void setCardid(int cardid) {
        this.cardid = cardid;
    }

    public void setCardname(String cardname) {
        this.cardname = cardname;
    }

    public void setCardimage(String cardimage) {
        this.cardimage = cardimage;
    }

    public void setCarddescription(String carddescription) {
        this.carddescription = carddescription;
    }

    public void setCardprice(float cardprice) {
        this.cardprice = cardprice;
    }
}

我正在实现 Serializable,因为我将此数据作为意图发送给其他活动。

为清晰添加了更多日志选项 当我运行应用程序时,我得到的日志输出是:

03-17 15:05:55.200 4501-4501/com.vdeveloper.chaisutta D/BeveragesTAG: Item received, received:1
03-17 15:05:55.227 4501-4501/com.vdeveloper.chaisutta D/BeveragesTAG: Item received:{"a":0,"e":0.0}
03-17 15:05:55.227 4501-4501/com.vdeveloper.chaisutta D/BeveragesTAG: Item received:com.vdeveloper.chaisutta.b.a@63d3fc
03-17 15:05:55.227 4501-4501/com.vdeveloper.chaisutta D/BeveragesTAG: card name:null

数据库截图:

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebaseui


    【解决方案1】:

    我自己找到了解决方案。问题出在我的 POJO 上。由于这个项目在 androidx 上,我需要添加注释“@Keep”以阻止编译器删除它认为多余的方法。

    import java.io.Serializable;
    
    import androidx.annotation.Keep;
    
    @Keep
    public class GenericProductModel implements Serializable {
    
        public int cardid;
        public String cardname;
        public String cardimage;
        public String carddescription;
        public float cardprice;
    
        public GenericProductModel() {
        }
    
        public GenericProductModel(int cardid, String cardname, String cardimage, String carddescription, float cardprice) {
            this.cardid = cardid;
            this.cardname = cardname;
            this.cardimage = cardimage;
            this.carddescription = carddescription;
            this.cardprice = cardprice;
        }
    
        public int getCardid() {
            return cardid;
        }
    
        public String getCardname() {
            return cardname;
        }
    
        public String getCardimage() {
            return cardimage;
        }
    
        public String getCarddescription() {
            return carddescription;
        }
    
        public float getCardprice() {
            return cardprice;
        }
    
        public void setCardid(int cardid) {
            this.cardid = cardid;
        }
    
        public void setCardname(String cardname) {
            this.cardname = cardname;
        }
    
        public void setCardimage(String cardimage) {
            this.cardimage = cardimage;
        }
    
        public void setCarddescription(String carddescription) {
            this.carddescription = carddescription;
        }
    
        public void setCardprice(float cardprice) {
            this.cardprice = cardprice;
        }
    }
    

    谢谢大家的帮助

    【讨论】:

    • 很高兴听到您找到了解决方案。这曾经是一个更大的问题,但随着时间的推移变得不那么普遍了。很抱歉你被它咬了,但我很高兴你明白了。
    【解决方案2】:

    你得到null,因为你所有的值都是null,因为你在每个getter中返回this.fieldName而不是fieldName。要解决此问题,请将您的吸气剂更改为:

    public int getCardid() {
        return cardid;
    }
    
    public String getCardname() {
        return cardname;
    }
    
    public String getCardimage() {
        return cardimage;
    }
    
    public String getCarddescription() {
        return carddescription;
    }
    
    public float getCardprice() {
        return cardprice;
    }
    

    看,没有this了。

    【讨论】:

    • 其实我在绝望中添加了“this”以使其工作。我恢复使用这些 getter,但它仍然返回 null。
    • 唯一需要显式引用this.cardname 的情况是当您有一个同名的局部变量时。 OPs 构造函数和设置器中的情况,其中还有一个同名的参数。因此,您可以使用this.cardname = cardname 来消除字段和参数名称之间的歧义。但是在getter中没有这样的参数,所以不需要消歧。
    • @FrankvanPuffelen 我知道何时使用“this”,但我找不到任何其他解决方案,所以绝望地尝试了。即使进行了更改,POJO 也会返回 null
    • @Developer97 除了你的POJO类,你的代码在我看来还不错,为什么你说还是null,有没有做其他修改?
    • @AlexMamo 不,我没有,这也让我感到困惑。我能够获得密钥 ref,这意味着正在获取数据我只是无法使用我的 POJO 解析它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2021-05-04
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多