Firebase模型POJO getter在FirebaseRecyclerAdapter中返回null

问题描述 投票:1回答:2

我有一个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

数据库截图:enter image description here

java android firebase firebase-realtime-database firebaseui
2个回答
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;
    }
}

谢谢,大家帮忙


0
投票

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

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了。

© www.soinside.com 2019 - 2024. All rights reserved.