2016-12-05 130 views
1

我有我的firebaseRecyclerAdapter及其populateViewHolder如下访问子节点

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

       } 
      }); 
     } 

这是备份用回收适配器和我的数据库看起来像

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

我的前任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'点? – Wilik

回答

0

看起来你不知道如何Firebase UI Database作品。完整的文档是here,您应该阅读该自述文件以了解其工作原理。

populateViewHolder方法的工作原理几乎相同onChildAdded/onChildChanged它返回一个引用的节点下的每个孩子。

因此,它应该是这样的

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

    ... 
} 

顺便说一句,你ChatList模型类已缺失的属性或属性并不反映在数据库中的密钥,这样一些方法可能返回null值。 Read and Write Data on Android

+0

非常感谢你这一点。但我完全理解如何做到这一点,但问题在于,这不是我想要返回的。 – Mordred

+0

我想返回对话的直接子对象。不是那些。 – Mordred

+0

那么'chatRef'在'用户/ /会话/''没有用户/ /会话/ /'指点? @Mordred – Wilik