2016-07-01 89 views
1

我在我的應用程序中實現了Firebase RecyclerView UI。我已經實現了一個recyclerview適配器,並且它顯示了以下異常。 以下是我的適配器代碼:DataSnapshot缺少一個沒有參數的構造函數

FirebaseRecyclerAdapter<DataSnapshot, MyHolder> recyclerAdapter = new FirebaseRecyclerAdapter<DataSnapshot, MyHolder>(
       DataSnapshot.class, 
       R.layout.row_slots, 
       MyHolder.class, 
       databaseReference.child("slots").child(uid).child(dayOfWeek).child("time") 
     ) { 
      @Override 
      protected void populateViewHolder(MyHolder viewHolder, DataSnapshot model, int position) { 

       System.out.println("Key : "+model.getKey()); 

      } 

     }; 

它顯示以下異常: enter image description here

我怎樣才能使用FirebaseRecyclerAdapter快照價值?

+0

你必須定義自己的模型類。 – Piyush

+0

是的,我已經這樣做了。但是對於我自己的模型類,我無法獲得每個節點的密鑰,因爲我們可以從快照中獲取密鑰。這就是爲什麼我正在嘗試使用快照。有沒有什麼辦法可以用我們自己的類來獲得節點的密鑰(沒有將密鑰存儲爲該節點的子節點) – Dhaval

+0

我認爲存在一些誤解。讓我們假設有一個節點用戶。每次我使用方法push()添加新用戶。現在用戶有兩個孩子的名字和電子郵件。所以爲了檢索,我創建了一個帶有兩個字段名稱和電子郵件的User.class。一切正常。但是,如果我想檢索該用戶的推送ID,該怎麼辦?使用快照我們可以得到,但使用User.class我們不能得到這是因爲用戶節點中沒有包含推式ID的子節點。 – Dhaval

回答

3

firebaser(和FirebaseUI適配器的作者)在這裏

很多很好的答案已經。我確實通常建議創建一個代表數據對象的Java類。

但是,如果你在使用DataSnapshot意圖,則可以覆蓋FirebaseRecyclerAdapter.parseSnapshot處理「轉換」:

@Override 
protected ChatMessage parseSnapshot(DataSnapshot snapshot) { 
    return snapshot; 
} 
+1

@Dhaval如果它是Puf並且它是關於Firebase的,那麼您應該仔細研究它。 –

+1

@Frank謝謝。這是我正在尋找的。 :) – Dhaval

3

當初始化你recyclerAdapter,你傳遞一個DataSnapshot.class作爲modelClass,其中DataSnapshot並沒有真正有一個不帶參數,我認爲這是導致該錯誤的構造函數,也是我認爲這使得DataSnapshot無效modelClass

正如FirebaseRecyclerViewAdaptermodelClass說:

modelClass - 火力地堡將馬歇爾的數據在一個位置到您提供

一個類的實例,你應該定義自己的modelClass通過創建滿足您需求的對象。在FirebaseRecyclerViewAdapter鏈接上有一個簡單的例子,您可以查看。乾杯!


編輯

按照該意見,我建議有自己的modelClass對象有DataSnapshot作爲參數。有關我所說的一個簡單示例,請參閱下文。

public class ModelClass { 

     String sampleString; 

     ModelClass() { 
     } 

     ModelClass(DataSnapshot dataSnapshot) { 
      // Do what you need from the dataSnapshot here 
      sampleString = dataSnapshot.child("").toString(); 
     } 

    } 

我想從上面的例子中,你會明白我的意思。 但是,我不確定這是否被推薦,甚至是否可以接受。我以前沒有試過這個,所以我也不確定它是否會起作用。

由於這種擔心實際上與張貼的不同。我建議發佈一個不同的,如果它不起作用。快樂編碼。乾杯!

+0

是的,我已經這樣做了。但是對於我自己的模型類,我無法獲得每個節點的密鑰,因爲我們可以從快照中獲取密鑰。這就是爲什麼我正在嘗試使用快照。有沒有什麼方法可以用我們自己的類來獲得節點的密鑰(不要將密鑰存儲爲該節點的子節點) – Dhaval

+0

你可以讓你的'modelClass'具有'DataSnapshot'參數,並且可以解析/檢索來自那裏的dataSnapshot的值。 :) –

+0

你能幫我一下嗎?有沒有任何例子,或者你可以提供任何示例嗎? – Dhaval

6

問題是DataSnapShot缺少一個沒有參數構造函數,所以你不能直接像這樣使用它。

改爲使用其他模型類。

像這樣:

創建自己的模型稱爲FriendlyMessage

public class FriendlyMessage { 

private String text; 
private String name; 

// Created constructor with no Arguments 
public FriendlyMessage() { 
} 

public FriendlyMessage(String text, String name) { 
    this.text = text; 
    this.name = name;  
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

最重要事情我們已經創建構造不帶參數 這是在DataSnapShot失蹤

注意:上面的模型類僅僅是一個例子,因爲您是firebase中的新成員。你可以擁有你自己的模型類和你自己的參數類型。

使用它像這樣爲你的火力地堡Recyclerview:

FirebaseRecyclerAdapter mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MyHolder>(
        FriendlyMessage.class, 
        R.layout.row_slots, 
        MyHolder.class, 
        databaseReference.child("slots").child(uid).child(dayOfWeek).child("time")) { 

     @Override 
     protected void populateViewHolder(MyHolder viewHolder, FriendlyMessage friendlyMessage, int position) 
     { 

     } 
    }; 

編輯:

它也不管你是如何推動在數據庫中的數據。直接用你的模型類 。

例如,對於上述模型FriendlyMessage推這樣的:

FriendlyMessage friendlyMessage = new FriendlyMessage("message", "Username"); 
databaseReference.child(MESSAGES_CHILD).push().setValue(friendlyMessage); 

這裏您child()將是我的實現有些不同,這只是一個例子。

用於收聽特定DataSnapShot:

databaseReference.child("users").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       //The PUSH ID OP WANTED 

       System.out.println("Push Id ---"+postSnapshot.getKey()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }) 

解釋上述監聽器。它會爲您提供DataSnapShot 對象,讓您的每個用戶落入您的孩子「用戶」。 您可以通過getKey()方法訪問Push id。

+0

可以設置一個示例如何推送id謝謝ondatachange –

相關問題