当前位置: 动力学知识库 > 问答 > 编程问答 >

android - Access child nodes in firebase recycler adapter

问题描述:

I have my firebaseRecyclerAdapter and its populateViewHolder is as follows

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);

}

});

}

This is backed up with a recycler adapter and my database looks something like

users

uid

conversations

sLname + sFname

-KyF........:

message: hi

timestamp: ServerValue.timestamp

-KyFr......:

message:hello

timestamp: ServerValue.timestamp

The implementation of 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 im 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 export.json is

 "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() points here

 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;

}

}

The problem here is that im trying to retrieve those messages recursively in a recycler adapter.

But with the former code on top, I just keep getting a repeat of the first message.

Could anyone tell me whats going on and how i can fix it. And if you need any additional information, just ask. Thank you

网友答案:

Looks like you don't understand how Firebase UI Database works. The full documentation is here, you should read that readme to understand how it works.

The populateViewHoldermethod works almost the same as onChildAdded/onChildChanged where it returns each child under a referenced node.

So it should look like this

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);

    ...
}

By the way, your ChatList model class has missing properties or the properties does not reflect the keys in the database so some method might return null value. Read and Write Data on Android

分享给朋友:
您可能感兴趣的文章:
随机阅读: