2017-11-17 135 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