2016-11-01 3 views
0

Ich arbeite auf einem Android-App, wo Benutzer friendlist mit diesem Aufbau in Firebase haben:Wie aktualisiere Liste in einem Adapter mit Firebase-Datenbank?

{ users: { 
     user_1: { 
      name: John 
     }, 
     user_2: { 
      name: Jack 
     }, 
     user_3: { 
      name: Georges 
     }, 
    }, 
    { friendships : { 
     user_1 : { 
     user_2: true, 
     user_3: true, 
     user_3: { 
     user_1: true, 
     user_2: true 
     } 
    } 

Ich mag einen Freund Liste mit Recycler Ansicht anzuzeigen. Ich mache das und es funktioniert.

In meinem Fragment:

public void getUsers() { 
    userDataset = new ArrayList<>(); 
    Query usersQuery = getQuery(mDatabase); 

    usersQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot friendshipSnapshot : dataSnapshot.getChildren()) { 
       final String userKey = friendshipSnapshot.getKey(); 

       final DatabaseReference userRef = mDatabase.child("users").child(userKey); 

       userDataset.add(userRef); 
      } 

      FriendsAdapter mAdapter = new FriendsAdapter(getContext(), userDataset); 
      mRecycler.setAdapter(mAdapter); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w(LOG_TAG, "loadFriendship:onCancelled", databaseError.toException()); 
     } 
    }); 
} 

Mein Adapter:

public class FriendsAdapter extends RecyclerView.Adapter<UserViewHolder> { 

    private Context mContext; 
    private List<DatabaseReference> userDataset = new ArrayList<>(); 

    public FriendsAdapter(Context context, List<DatabaseReference> userDataset) { 
     this.mContext = context; 
     this.userDataset = userDataset; 
    } 

    @Override 
    public UserViewHolder onCreateViewHolder(ViewGroup parent, 
              int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_user, parent, false); 
     // set the view's size, margins, paddings and layout parameters 

     UserViewHolder userViewHolder = new UserViewHolder(mContext, v); 
     return userViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(UserViewHolder holder, int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 

     holder.bindToUser(userDataset.get(position)); 

    } 

    @Override 
    public int getItemCount() { 
     return userDataset.size(); 
    } 

} 

Mein ViewHolder:

public class UserViewHolder extends RecyclerView.ViewHolder { 

private Context mContext; 

public TextView firstNameView; 
public TextView lastNameView; 
public CircleImageView userPhotoView; 
public TextView userDistanceView; 

public UserViewHolder(Context context, View itemView) { 
    super(itemView); 

    mContext = context; 

    firstNameView = (TextView) itemView.findViewById(R.id.user_first_name); 
    lastNameView = (TextView) itemView.findViewById(R.id.user_last_name); 
    userPhotoView = (CircleImageView) itemView.findViewById(R.id.user_photo); 
    userDistanceView = (TextView) itemView.findViewById(R.id.user_distance); 
} 

public void bindToUser(DatabaseReference userRef) { 

    userRef.addValueEventListener(new ValueEventListener() { 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      User user = dataSnapshot.getValue(User.class); 
      firstNameView.setText(user.firstName); 
      lastNameView.setText(user.lastName); 

      userDistanceView.setText(user.getDistance(((MainActivity) mContext).currentUserLocation())); 

      Picasso.with(mContext).load(user.profilePicture).placeholder(R.drawable.ic_action_account_circle_40).into(userPhotoView); 
     } 

     public void onCancelled(DatabaseError databaseError) { 
      System.out.println("The read failed: " + databaseError.getMessage()); 
     } 
    }); 

}} 

Aber jetzt, ich WO Ich möchte meine Benutzer in der Liste sortieren, und ich weiß nicht, wie ich das tun kann, weil mein Dataset DatabaseReference Objekte und nicht User Objekte enthält. Ich nehme an, dass die Art, wie ich mein Dataset erstelle, schlecht ist. Können Sie mir sagen, wie ich meine Benutzer zum Beispiel nach Namen sortieren kann?

Wie Sie zuerst sehen können, hole ich die Freundschaften meines Benutzers (im Fragment). Mit diesen Freundschaften erstelle ich einen Datensatz mit DatabaseReference Objekten, die sich auf jeden Benutzer (Freunde) beziehen. Schließlich, in meinem ViewHolder, hole ich die Daten jedes Benutzers und füllen Sie die Ansicht. Daher füge ich niemals Benutzerinformationen in mein Dataset ein, sondern nur DatabaseReference.

Vielen Dank.

+0

Ich glaube nicht, dass es doppelt ist. Mein Problem ist, wie Benutzerobjekte sortiert werden, wenn mein Dataset DatabaseReference-Objekte enthält. – aurevec

+0

Sie notifizieren den Adapter neuer Daten nie. Zeigt das zur Zeit nichts an? –

+0

Ja, die Daten werden angezeigt. – aurevec

Antwort

0

Sie können die Daten beim Abrufen aus der Datenbank wie folgt sortieren.

// My top posts by number of stars 
    String myUserId = getUid(); 
    Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId) 
    .orderByChild("starCount"); 
myTopPostsQuery.addChildEventListener(new ChildEventListener() { 
// TODO: implement the ChildEventListener methods as documented above 
// ... 
}); 

Bitte diesen Link gehen throught, können Sie weitere Informationen zum Sortieren von Daten

https://firebase.google.com/docs/database/android/lists-of-data

+0

Ich kann das nicht tun, weil ich Daten von Freundschaften, die keine Benutzerinformationen enthalten, nur ID abrufen. – aurevec

+0

Sie können jede Art von Daten durch Abfragen der Datenbank sortieren –

0

Sie können keine DatabaseReference in einem User-Objekt konvertieren finden. Sie können eine DataSnapshot-Datei mithilfe von getValue in ein Benutzerobjekt konvertieren.

Was Sie tun sollten, ist zu ändern, wie Sie die Daten speichern, um Redundanz hinzuzufügen. In einer NoSQL-Datenbank gibt es keine Möglichkeit, denormalisierte Daten wie gewünscht zu speichern.

Ihre Daten wie folgt aussehen kann:

users: { 
    user_1: { 
    name: John, 
    friends: { 
     user_2: { 
     name: Jack 
     }, 
     user_3: { 
     name: Georges 
     }, 
    } 
    }, 
    user_2: { 
    name: Jack, 
    frinds: {...} 
    }, 
    user_3: { 
    name: Georges, 
    friends: {...} 
    }, 
} 

Dann können Sie Ihre Query ändern, um einen Benutzer Freundesliste zu bekommen.

Dies ist nicht der einzige Weg, wie Sie Ihre Daten organisieren können, es ist nur ein Beispiel. Es hängt davon ab, wie Sie die Daten abfragen wollen.

+0

Jeder Benutzer hat andere Felder, die ich benutze und in Echtzeit anzeigen, ich kann nicht alle Benutzer in Freunden aktualisieren, wenn sich ein Feld ändert. Dafür benutze ich diese aktuelle Datenstruktur. – aurevec

+0

Ich kann mir keine Lösung vorstellen, ohne die Datenstruktur zu ändern. Vielleicht können Sie das 'friendships' Attribut etwas wie folgt ändern:' Freundschaften: { user_1: { user_2: {name: ...}, user_3: {name: ...}, user_3: { user_1 : {name: ...}, user_2: {name: ...} } } ' – rubenlop

+0

Der entscheidende Punkt hier ist, dass Sie alle Daten, die Sie anzeigen müssen, mit nur einer" Abfrage "abrufen müssen. – rubenlop

Verwandte Themen