2017-11-17 143 views
0

我有两个活动,一个用于创建评估对象,另一个用于列出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" 
}, 

任何帮助,您可以给我将是极好的,我一直在包裹我的头围绕这几天挣扎。谢谢!!

回答

1

在这一行:

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(); 
+0

'mReference = FirebaseDatabase.getInstance()。getReference(); mEvalRef = mReference.child(FIREBASE_ASSESSMENTS);'是我如何使用它,其中'FIREBASE_ASSESSMENTS'是在我火力 结构中的条目常数是这样的: 应用 | ___评估 | | ___ {子键} | ___用户 | ___ etc – Tadhg

+0

检查编辑,看看是否有帮助 –

+0

添加setter没有改变任何我害怕。在技​​术上,这些变量是在呼叫新评估时设定的,即“评估=新评估(a,b,c,d等)”; – Tadhg