2016-12-05 4 views
1

は私が持っている私のfirebaseRecyclerAdapter、そのこれはリサイクルアダプタでバックアップされアクセス子ノードが

Query queryRef = chatRef.orderByKey(); 
queryRef.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot snapshot, String previousChild) { 
     System.out.println(snapshot.getKey()); 

     for (DataSnapshot snapshot1 : snapshot.getChildren()) { 
      final String firstname = snapshot.getKey(); 
      chatViewHolder.setName(firstname); 

      chatViewHolder.mView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        //Log.w(TAG, "You clicked on "+position); 
        //String firstname = tList.getFirstname(); 
        //String lastname = tList.getLastname(); 
        //firstname = firstname.substring(0, 1).toUpperCase() + firstname.substring(1); //convert first string to uppercase 
        //lastname = lastname.substring(0, 1).toUpperCase() + lastname.substring(1);// same thing happening here 
        //String name = (firstname + " " + lastname); // concatenate firstname and lastname variable. 

        Intent intent = new Intent(getActivity(), MainChat.class); //change to onclick 
        intent.putExtra("fullname", firstname); 
        //you can name the keys whatever you like 
        //intent.putExtra("image", userList.getImgUrl().toString()); //note that all these values have to be primitive (i.e boolean, int, double, String, etc.) 
        startActivity(intent); 

       } 
      }); 
     } 

次のようにpopulateViewHolderであり、私のデータベースは

users 
    uid 
     conversations 
        sLname + sFname 
          -KyF........: 
            message: hi 
            timestamp: ServerValue.timestamp 
          -KyFr......: 
            message:hello 
            timestamp: ServerValue.timestamp 

実装のようになりますfirebaseRecyclerAdapter

RecyclerView recycler = (RecyclerView) rootView.findViewById(R.id.recyclerview4); 
recycler.setHasFixedSize(true); 
recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 


FirebaseRecyclerAdapter mAdapter = new FirebaseRecyclerAdapter<ChatList, ChatHolder>(ChatList.class, R.layout.chatlistrow, ChatHolder.class, chatRef) { 
    @Override 
    public void populateViewHolder(final ChatHolder chatViewHolder, final ChatList chatList, final int position) { 

     //try catch block to catch events of no posts, it will most likely return a null error, so I'm catching it, else 
     //find its exception and catch itef 

     contactList = new ArrayList<String>(); 

     //start here and getkey for everyone 

     contactList.add(chatRef.getKey()); 

     //String firstname = chatRef.getKey(); 
     //chatViewHolder.setName(firstname); 

     Query queryRef = chatRef.orderByKey(); 
     queryRef.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot snapshot, String previousChild) { 
       System.out.println(snapshot.getKey()); 

       for (DataSnapshot snapshot1 : snapshot.getChildren()) { 
        final String firstname = snapshot.getKey(); 
        chatViewHolder.setName(firstname); 

        chatViewHolder.mView.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          //Log.w(TAG, "You clicked on "+position); 

          Intent intent = new Intent(getActivity(), MainChat.class); //change to onclick 
          intent.putExtra("fullname", firstname); 
          //you can name the keys whatever you like 
          //intent.putExtra("image", userList.getImgUrl().toString()); //note that all these values have to be primitive (i.e boolean, int, double, String, etc.) 
          startActivity(intent); 
         } 
        }); 
       } 
       //testing 
      } 

      @Override 
      public void onChildChanged(DataSnapshot snapshot, String previousChild) { 
      } 

      @Override 
      public void onChildMoved(DataSnapshot snapshot, String previousChild) { 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot snapshot) { 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
      // .... 
     }); 
    } 
}; 
recycler.setAdapter(mAdapter); 

my ex port.jsonが

"admin" : { 
    "ZpMBDchTkPVh7El3EsIKEdmV28n1" : { 
     "bio" : "", 
     "conversations" : { 
     "Chinwendu Chiebidolu" : { 
      "-KYCaWdm7IJrF-yau0ES" : { 
      "message" : "hello", 
      "rfirstname" : "Chinwendu", 
      "rimgUrl" : "", 
      "rlastname" : "Chiebidolu", 
      "rname" : "Chinwendu Chiebidolu", 
      "timestamp" : 1480918181229, 
      "userId" : "lgsmNM2LXuVq8NBoDwDCaoe5B613" 
      } 
     }, 
     "Damilola Aromiwe" : { 
      "-KYBzfTc5xHCPGM06QIE" : { 
      "message" : "hi", 
      "rfirstname" : "Damilola", 
      "rimgUrl" : "2124", 
      "rlastname" : "Aromiwe", 
      "rname" : "Damilola Aromiwe", 
      "timestamp" : 1480907995851, 
      "userId" : "ujNyb5erkSN7oS3aGZlXyc9Q0YJ2" 
      }, 
      "-KYCYYkifzI-61dBKsTT" : { 
      "message" : "hello", 
      "rfirstname" : "Damilola", 
      "rimgUrl" : "2124", 
      "rlastname" : "Aromiwe", 
      "rname" : "Damilola Aromiwe", 
      "timestamp" : 1480917404523, 
      "userId" : "ujNyb5erkSN7oS3aGZlXyc9Q0YJ2" 
      }, 
      "-KYCZ19NM2yKinU5eSLt" : { 
      "message" : "hello mr dammy, are you there? ", 
      "rfirstname" : "Damilola", 
      "rimgUrl" : "2124", 
      "rlastname" : "Aromiwe", 
      "rname" : "Damilola Aromiwe", 
      "timestamp" : 1480917527734, 
      "userId" : "ujNyb5erkSN7oS3aGZlXyc9Q0YJ2" 
      } 
     } 
     }, 
     "email" : "[email protected]", 
     "firstname" : "Toyosi", 
     "imgUrl" : "2124", 
     "lastname" : "Yusuf", 
     "name" : "toyosi", 
     "parent" : true, 
     "phone" : "", 
     "teacher" : false, 
     "userId" : "ZpMBDchTkPVh7El3EsIKEdmV28n1" 
    } 
    }, 
    "teachers" : { 
    "inFa52OMArdKyUTMYrkRqWs50uD2" : { 
     "bio" : "", 
     "email" : "[email protected]", 
     "firstname" : "David", 
     "imgUrl" : "", 
     "lastname" : "Akinyemi", 
     "name" : "", 
     "parent" : false, 
     "phone" : "", 
     "teacher" : true, 
     "userId" : "inFa52OMArdKyUTMYrkRqWs50uD2" 
    }, 
    "xITyS4TrbWXPBhHYAgz0ZsdyYFa2" : { 
     "bio" : "", 
     "email" : "[email protected]", 
     "firstname" : "Ejura", 
     "imgUrl" : "", 
     "lastname" : "Ayeni", 
     "name" : "", 
     "parent" : false, 
     "phone" : "", 
     "teacher" : true, 
     "userId" : "xITyS4TrbWXPBhHYAgz0ZsdyYFa2" 
    } 
    }, 
    "users" : { 
    "HJ55v7xUGmXQN2o1AQFDG9JtzCy1" : { 
     "bio" : "", 
     "email" : "[email protected]", 
     "firstname" : "", 
     "imgUrl" : "", 
     "lastname" : "", 
     "name" : "", 
     "parent" : true, 
     "phone" : "", 
     "teacher" : false, 
     "userId" : "HJ55v7xUGmXQN2o1AQFDG9JtzCy1" 
    }, 
    "KrVp7D6gLoZoH6WcHT5tmyqb3o53" : { 
     "bio" : "", 
     "email" : "[email protected]", 
     "firstname" : "", 
     "imgUrl" : "", 
     "lastname" : "", 
     "name" : "", 
     "parent" : true, 
     "phone" : "", 
     "teacher" : false, 
     "userId" : "KrVp7D6gLoZoH6WcHT5tmyqb3o53" 
    }, 
    "lgsmNM2LXuVq8NBoDwDCaoe5B613" : { 
     "bio" : "", 
     "conversations" : { 
     "Toyosi Yusuf" : { 
      "-KYCaWdHGbWxsk8h7EWy" : { 
      "message" : "hello", 
      "sfirstname" : "Toyosi", 
      "simageurl" : "2124", 
      "slastname" : "Yusuf", 
      "timestamp" : 1480918179544 
      } 
     } 
     }, 
     "email" : "[email protected]", 
     "firstname" : "Chinwendu", 
     "imgUrl" : "", 
     "lastname" : "Chiebidolu", 
     "name" : "", 
     "parent" : true, 
     "phone" : "", 
     "teacher" : false, 
     "userId" : "lgsmNM2LXuVq8NBoDwDCaoe5B613" 
    }, 
    "ujNyb5erkSN7oS3aGZlXyc9Q0YJ2" : { 
     "bio" : "", 
     "conversations" : { 
     "Toyosi Yusuf" : { 
      "-KYBzfT_p8N2oW7oqSke" : { 
      "message" : "hi", 
      "sfirstname" : "Toyosi", 
      "simageurl" : "2124", 
      "slastname" : "Yusuf", 
      "timestamp" : 1480907995531 
      }, 
      "-KYCYYkfORU70Y1_PGug" : { 
      "message" : "hello", 
      "sfirstname" : "Toyosi", 
      "simageurl" : "2124", 
      "slastname" : "Yusuf", 
      "timestamp" : 1480917401926 
      }, 
      "-KYCZ19KyX8X5G25CEz5" : { 
      "message" : "hello mr dammy, are you there? ", 
      "sfirstname" : "Toyosi", 
      "simageurl" : "2124", 
      "slastname" : "Yusuf", 
      "timestamp" : 1480917527335 
      } 
     } 
     }, 
     "email" : "[email protected]", 
     "firstname" : "Damilola", 
     "imgUrl" : "2124", 
     "lastname" : "Aromiwe", 
     "name" : "", 
     "parent" : true, 
     "phone" : "", 
     "teacher" : false, 
     "userId" : "ujNyb5erkSN7oS3aGZlXyc9Q0YJ2" 
    } 
    } 
} 

chatList.class()ポイントで、ここで

package com.mordred.theschoolapp; 

/** 
* Created by mordred on 11/29/16. 
*/ 
public class ChatList { 

    public String userId; 
    public String rname; 
    public String rlastname; 
    public String rimageurl; 

    public ChatList() { 
     // Default constructor required for calls to DataSnapshot.getValue(User.class) 
    } 

    public String getFirstname() { 
     return rname; 
    } 

    public void setFirstname(String firstname) { 
     this.rname = firstname; 
    } 

    public String getLastname() { 
     return rlastname; 
    } 

    public void setLastname(String lastname) { 
     this.rlastname = lastname; 
    } 

    public String getImgUrl() { 
     return rimageurl; 
    } 

    public void setImgUrl(String imgUrl) { 
     this.rimageurl = imgUrl; 
    } 

    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 
} 

ここでの問題は、イムは、リサイクルアダプタに再帰的にそれらのメッセージを取得しようとしているということです。 しかし、前のコードを上にして、最初のメッセージの繰り返しを続けます。 何が起こっているのか誰に教えてもらえますか?どのように修正できますか?追加情報が必要な場合は、尋ねてください。ありがとうございました

+0

私はあなたの問題を理解できません。あなたは 'FirebaseRecyclerAdapter'の実装を投稿し、どのノードがデータベースを待ち受けているのか、' chatRef'が指しているところを指摘できますか?また、データベースの 'sLname + sFname'はどういう意味ですか?正確なJSON形式を投稿する方が良いです。Firebaseデータベースコンソールから** JSONをエクスポートするだけです。 – Wilik

+0

ありがとう、私はちょうど私の質問 – Mordred

+0

を更新したので、 'chatRef'はこのノード' users//conversations//'を指していますか? – Wilik

答えて

0

どのように理解できないように見えますかFirebase UI Database完全なドキュメントはhereです。どのように動作するかを理解するには、そのreadmeを読む必要があります。

populateViewHolderメソッドは、onChildAdded/onChildChangedとほぼ同じように動作し、参照先ノードの下に各子を返します。

だから、あなたのChatListモデルクラスは、そのいくつかの方法がnull値を返す可能性があるプロパティまたはプロパティは、データベース内のキーを反映していない行方不明た、ちなみにこの

chatRef = FirebaseDatabase.getInstance().getReference("users").child(uid).child("conversations"); 

... 

@Override 
public void populateViewHolder(final ChatHolder chatViewHolder, final ChatList chatList, final int position) { 
    contactList = new ArrayList<String>(); 
    // this is what you want 
    String fullName = mAdapter.getRef(position).getKey(); 
    contactList.add(fullName); 

    ... 
} 

のようになります。 Read and Write Data on Android

+0

ありがとうございます。しかし、私はこれを行う方法を完全に理解していますが、ここでの問題は、それが私が返すものではないということです。 – Mordred

+0

私は会話の直接の子を返したいと思います。それらのものではありません。 – Mordred

+0

'chatRef'は' users//conversations/'ではなく、' users//conversations//'を指していますか? @Mordred – Wilik