无法使用FirebaseRecyclerAdapter将Firebase JSON转换为Java对象
问题描述:
我有两个活动,一个用于创建评估对象,另一个用于列出Firebase中的评估对象,但是我遇到了一个问题:POJO能够序列化为JSON很好,但FirebaseRecyclerAdapter
似乎无法将JSON数据返回给对象类型。无法使用FirebaseRecyclerAdapter将Firebase JSON转换为Java对象
这是我的目标文件:
@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;
}
在此基础上,我用这个代码写入到火力地堡,这一切工作正常:
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);
}
}
我不确定我要去哪里g FirebaseRecyclerAdapter
无法将数据转换回Assessment
对象。我没有正确设置对象吗?我没有正确设置RecyclerAdapter吗?这是数据的外观在火力地堡
"-KzB39l1KH6MyEsgr6Ke" : {
"companyName" : "testing ",
"industryName" : "at",
"isDraft" : true,
"isQuickWalk" : true,
"locationName" : "five fifteen",
"ownerName" : "[email protected]",
"productName" : "please ignore"
},
任何帮助,您可以给我将是极好的,我一直在包裹我的头围绕这几天挣扎。谢谢!!
答
在这一行:
Query query = mEvalRef;
我认为mEvalRef是数据库基准,可以显示它,因为它不清楚如何从数据库中查询数据。
只需添加(mEvalRef),以便找到问题。
编辑
在你的(评估)班,我注意到,有是变量没有setter方法,添加setter方法类中的每个变量,看看是否有所帮助。
EDIT 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 {
,不要忘记保持setter方法变量,评估类,使变量公众,我告诉你。
编辑3
现在忘掉EDIT 2并重新输入你的代码中原来所采取的方式,只是这样做,你配置后的一切:
在您初始化适配的方法,添加在此之前:
mRecyclerView.setAdapter(adapter);
这样的:
adapter.startListening();
'mReference = FirebaseDatabase.getInstance()。getReference(); mEvalRef = mReference.child(FIREBASE_ASSESSMENTS);'是我如何使用它,其中'FIREBASE_ASSESSMENTS'是在我火力 结构中的条目常数是这样的: 应用 | ___评估 | | ___ {子键} | ___用户 | ___ etc – Tadhg
检查编辑,看看是否有帮助 –
添加setter没有改变任何我害怕。在技术上,这些变量是在呼叫新评估时设定的,即“评估=新评估(a,b,c,d等)”; – Tadhg