2016-07-01 23 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を使用してスナップショット値を得ることができますか?あなたのrecyclerAdapterを初期化するときDataSnapshotは本当に私は、エラーの原因となっていると思いパラメータなしでコンストラクタを持っていないことを特徴と

+0

独自のモデルクラスを定義する必要があります。 – Piyush

+0

はい私はそのようにしました。しかし、自分のモデルクラスでは、スナップショットから取得できるように各ノードのキーを取得することができません。それが私がSnapshotで試している理由です。私たち自身のクラスでノードのキーを取得できる方法はありますか(そのノードの子としてキーを格納しないで) – Dhaval

+0

何か誤解があると思います。ノードユーザーが1人いると仮定します。新しいユーザーを追加するたびに、メソッドpush()を使用します。今、ユーザーは2つの子の名前と電子メールを持っています。だから私は2つのフィールドの名前と電子メールを持つ1つの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

、あなたがあなたのmodelClassとしてDataSnapshot.classを渡しても、私はそれがDataSnapshot無効modelClassを作ると思います。

modelClassためFirebaseRecyclerViewAdapterで述べたように:

modelClass - Firebaseウィル・マーシャル位置のデータあなたが

を提供するクラスのインスタンスへのあなたがmodelClass独自に定義する必要がありますあなたのニーズに合ったオブジェクトを作成します。あなたがチェックアウトできるFirebaseRecyclerViewAdapterリンクの簡単な例があります。乾杯!


EDIT

コメントを1として、私は、パラメータとしてDataSnapshotを持っている独自のmodelClassオブジェクトを持つことが示唆されました。私が言っていることの簡単な例については、以下を参照してください。

public class ModelClass { 

     String sampleString; 

     ModelClass() { 
     } 

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

    } 

私は上記の例から、あなたは私が意味するものを得ると思います。 BUT、私はこれが推奨されているのか、それが受け入れられるのかどうかはわかりません。私はこれを試していないので、それがうまくいくかどうかも分かりません。

この懸念は実際に投稿されたものとは異なるためです。私はそれが動作しない場合は、別のものを投稿することをお勧めします。ハッピーコーディング。乾杯!

+0

はい私はそのようにしました。しかし、自分のモデルクラスでは、スナップショットから取得できるように各ノードのキーを取得することができません。それが私がSnapshotで試している理由です。私たち自身のクラスでノードのキーを取得する方法はありますか(そのノードの子としてキーを格納しないで) – 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としてあなたのための単なる例です。独自のタイプのパラメータとすべてのモデルクラスを持つことができます。

ご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) 
     { 

     } 
    }; 

はEDIT:

また、あなたがデータベースにデータをプッシュしているかは問題で。モデルクラスで を直接実行してください。例えば

上記のモデルのために、このようにそれをプッシュしFriendlyMessage:あなたのchild()が、それは一例であり、私の実装とは多少異なるものになります。ここ

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

。上記リスナを説明する

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を聴くため

。あなたの子供の "ユーザー"の中にいるすべてのユーザーのためのDataSnapShot オブジェクトを提供します。 プッシュIDにはgetKey()メソッドでアクセスできます。ここ

+0

あなたがidをpushする方法の例を設定することができますondatachange –

関連する問題