有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓无法使用FirebaseRecyclerAdapter将Firebase JSON转换为Java对象

我有两个活动,一个是创建评估对象,另一个是在Firebase中列出评估对象,但是我遇到了一个问题:POJO能够很好地序列化为JSON,但是FirebaseRecyclerAdapter似乎无法将JSON数据返回到对象类型

这是我的对象文件:

@IgnoreExtraProperties
public class Assessment {

private String company;
private String industry;
private String location;
private String product;
private String ownerId;
private String ownerName;
private boolean isDraft;
private boolean isQuickWalk;
private Map<String, Category> categories;



public Assessment() {
    // Default constructor required for calls to DataSnapshot.getValue()
}

public Assessment(String companyName, String industryName, String locationName,
                  String productName, String ownerId, String ownerName, boolean isDraft, boolean isQuickWalk, Map<String, Category> categories) {
    this.company = companyName;
    this.industry = industryName;
    this.location = locationName;
    this.product = productName;
    this.ownerId = ownerId;
    this.ownerName = ownerName;
    this.isDraft = isDraft;
    this.isQuickWalk = isQuickWalk;
    this.categories = categories;
}

public String getCompanyName() {
    return company;
}

public String getIndustryName() {
    return industry;
}

public String getLocationName() {
    return location;
}

public String getProductName() {
    return product;
}

public String getOwnerName() {
    return ownerName;
}

public boolean getIsDraft() {
    return isDraft;
}

public boolean getIsQuickWalk() {
    return isQuickWalk;
}

基于此,我使用此代码编写Firebase,一切正常:

String key = mDatabaseRef.child(FIREBASE_ASSESSMENTS).push().getKey();
Assessment assessment = new Assessment(editCompanyText, editLocationText,
                        editIndustryText, editProductText, uid, 
currentUser.getEmail(), isDraft, isQuickWalk, null);

Map<String, Object> childUpdates = new HashMap<>();
                childUpdates.put("/" + FIREBASE_ASSESSMENTS + "/" + key, 
assessment);
mDatabaseRef.updateChildren(childUpdates);

然而,当我试图从数据库中读取数据时,我相信这就是问题所在:

FirebaseRecyclerAdapter<Assessment, ViewDraftsViewHolder> adapter;
    mRecyclerView = (RecyclerView) findViewById(R.id.draft_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    Query query = mEvalRef;
    FirebaseRecyclerOptions<Assessment> options = new FirebaseRecyclerOptions.Builder<Assessment>()
            .setQuery(query, Assessment.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<Assessment, ViewDraftsViewHolder>(options) {
        @Override
        protected void onBindViewHolder(ViewDraftsViewHolder holder, int position, Assessment model) {
            if(model.getIsDraft()) {
                holder.companyName.setText(model.getCompanyName());
                holder.industryName.setText(model.getIndustryName());
                holder.locationName.setText(model.getLocationName());
                holder.productName.setText(model.getProductName());
                holder.ownerName.setText(model.getOwnerName());

                if(model.getIsQuickWalk()) {
                    holder.isQuickWalk.setText("Quick Walkthrough");
                } else {
                    holder.isQuickWalk.setText("Full Questionnaire");
                }
            }

        }

        @Override
        public ViewDraftsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.completed_and_drafts_list_item, parent, false);
            return new ViewDraftsViewHolder(view);
        }
    };

    mRecyclerView.setAdapter(adapter);

    private static class ViewDraftsViewHolder extends RecyclerView.ViewHolder {
    TextView companyName;
    TextView industryName;
    TextView locationName;
    TextView productName;
    TextView ownerName;
    TextView isQuickWalk;

    public ViewDraftsViewHolder(View itemView) {
        super(itemView);

        companyName = (TextView) itemView.findViewById(R.id.companyView);
        industryName = (TextView) itemView.findViewById(R.id.industryView);
        locationName = (TextView) itemView.findViewById(R.id.locationView);
        productName = (TextView) itemView.findViewById(R.id.productView);
        ownerName = (TextView) itemView.findViewById(R.id.ownerName);
        isQuickWalk = (TextView) itemView.findViewById(R.id.isQuickWalkView);
    }
}

我不确定我哪里出了问题,FirebaseRecyclerAdapter无法将数据转换回Assessment对象。我没有正确设置对象吗?我没有正确设置回收适配器吗?这就是Firebase中数据的外观

"-KzB39l1KH6MyEsgr6Ke" : {
  "companyName" : "testing ",
  "industryName" : "at",
  "isDraft" : true,
  "isQuickWalk" : true,
  "locationName" : "five fifteen",
  "ownerName" : "test@email.com",
  "productName" : "please ignore"
},

你能给我的任何帮助都将是非常好的,这几天我一直在绞尽脑汁。谢谢


共 (1) 个答案

  1. # 1 楼答案

    在这一行:

      Query query = mEvalRef;
    

    我假设mEvalRef是一个数据库引用,您能展示它吗?因为不清楚如何从数据库中查询数据

    只需添加(mEvalRef),即可找到问题

    编辑

    在您的(评估)类中,我注意到变量没有setter方法,请为类中的每个变量添加setter,看看这是否有帮助

    编辑2

    在代码中尝试读取值

    把这个拿走

        FirebaseRecyclerOptions<Assessment> options = new FirebaseRecyclerOptions.Builder<Assessment>()
            .setQuery(query, Assessment.class)
            .build();
    

    在这一行或适配器初始化的一部分中:

       adapter = new FirebaseRecyclerAdapter<Assessment, ViewDraftsViewHolder>(options)
    

    删除(选项)参数并将上面的代码行更改为:

          adapter = new FirebaseRecyclerAdapter<Assessment, ViewDraftsViewHolder>(Assessment.class, R.layout.completed_and_drafts_list_item, ViewDraftsViewHolder.class, query )
    

    接下来删除此代码:

            @Override
        public ViewDraftsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.completed_and_drafts_list_item, parent, false);
            return new ViewDraftsViewHolder(view);
        }
    

    最后将(私有)改为(公共):

        private static class ViewDraftsViewHolder extends RecyclerView.ViewHolder {
    

    别忘了在评估课上保留变量设置器,并像我告诉你的那样公开变量

    编辑3

    现在,忘记编辑2,按照最初的方式重新键入代码,在配置完所有内容后再执行此操作:

    在初始化适配器的方法中,在此之前添加:

       mRecyclerView.setAdapter(adapter);
    

    这是:

       adapter.startListening();