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.
Ich glaube nicht, dass es doppelt ist. Mein Problem ist, wie Benutzerobjekte sortiert werden, wenn mein Dataset DatabaseReference-Objekte enthält. – aurevec
Sie notifizieren den Adapter neuer Daten nie. Zeigt das zur Zeit nichts an? –
Ja, die Daten werden angezeigt. – aurevec