2016-03-26 19 views
7

Tôi biết cách sử dụng FirebaseRecyclerAdapter trên danh sách các mục trong Firebase. Tôi cũng biết cách lấy dữ liệu Firebase từ nhiều vị trí bằng cách sử dụng chỉ mục. Nhưng tôi không biết cách kết hợp điều này với FirebaseRecyclerAdapter.Cách sử dụng FirebaseRecyclerAdapter với tham chiếu động trong Android?

Tôi có một cấu trúc dữ liệu đơn giản mà người dùng có thể được bạn bè:

"users": { 
    "user1": { 
    "name": "name", 
    "friends": { 
     "user2": "true" 
     } 
    } 
    "user2": { 
    "name": "name", 
    "friends": { 
     "user1": "true" 
     } 
    } 
    } 

tôi sử dụng id duy nhất cho tên người dùng. Trong ví dụ đơn giản này, người dùng 1 và người dùng 2 là bạn bè. Những gì tôi muốn làm, là có được một danh sách của tất cả các tên (và sau này có thể nhiều hơn) bằng cách sử dụng một FirebaseRecyclerAdapter. Thông thường, tôi sẽ nhận được một danh sách bằng cách lấy id người dùng dưới "bạn bè" và sau đó sử dụng các id đó để điều hướng đến tên của họ. Trong Java, nó sẽ giống như sau:

Firebase ref = new Firebase("<reference>"); 
ref.child("users/user1/friends").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    String userId = snapshot.getKey(); 
    ref.child("users/" + userId + "/name").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     System.out.println(snapshot.getValue()); 
     } 
     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
     // Do something here 
     } 
    }); 
    } 
}); 

Nhưng khi sử dụng FirebaseRecyclerAdapter, bạn chỉ có thể xác định một URL. Bộ điều hợp sẽ tạo danh sách dựa trên các mục ở một nơi duy nhất.

Có cách nào để điều chỉnh bộ điều hợp để nó đọc dữ liệu từ nhiều nơi, giống như cách mà ví dụ trên không? Hoặc có cách nào để tạo biến thay đổi động chỉ trỏ đến id người dùng cũng được lưu trữ trong danh sách "bạn bè" của người dùng hiện tại không? Tôi đã suy nghĩ về việc sử dụng phương thức equals(), nhưng tôi không thể tìm ra chính xác như thế nào.

Một cách khác sẽ lưu trữ tên người dùng cũng trong danh sách "bạn bè". Nhưng điều đó sẽ không cải thiện cấu trúc dữ liệu. Tôi sẽ phải thay đổi tên ở hai nơi mỗi lần (và có thể là hình ảnh sau này) và nó sẽ giới thiệu nhiều dự phòng hơn.

Có ai có giải pháp cho vấn đề này không? Tôi không thể tìm thấy câu trả lời ở bất cứ nơi nào nhưng nó có vẻ giống như một mô hình chung. Và ngoài việc làm cho nó hoạt động, làm thế nào để tôi làm điều đó một cách hiệu quả?

Trả lời

11

Bạn cần phải tham gia dữ liệu, bằng cách đính kèm addListenerForSingleValueEvent().

FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder> adapter = new FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder>(
    Boolean.class, android.R.layout.two_line_list_item, ItemViewHolder.class, friendsRef){ 
    protected void populateViewHolder(final ItemViewHolder viewHolder, Boolean model, int position) { 
     String key = this.getRef(position).getKey(); 
     ref.child("users").child(key).addListenerForSingleValueEvent(new ValueEventListener() { 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String name = dataSnapshot.child("name").getValue(String.class); 
       ((TextView)viewHolder.itemView.findViewById(android.R.id.text1)).setText(name); 
      } 

      public void onCancelled(FirebaseError firebaseError) { } 
     }); 
    } 
}; 

Tôi đã thêm activity Activity36235919 to demonstrate this vào số sample repo của mình.

Sau khi thực hiện, tôi nhận ra rằng tôi đã trả lời câu hỏi này trước đây trong Coupling FirebaseRecyclerViewAdapter to a Boolean/String Map.Entry, vì vậy tôi sẽ đánh dấu câu hỏi của bạn là trùng lặp.

+0

phải đối mặt với sự cố sau khi sử dụng phương pháp bạn đã mô tả trong câu trả lời này ... hãy trợ giúp với nó: http://stackoverflow.com/q/41921120/6144372 –

+0

Tôi đã tìm ra sự cố gây ra sự cố như đã nêu trong câu hỏi trước của tôi ... Tôi đã đăng một câu hỏi khác dựa trên vấn đề đó. Hãy xem xét việc xem xét: http://stackoverflow.com/q/41925181/6144372 Cảm ơn! –

Các vấn đề liên quan