は、私は、ユーザーがFirebaseでこれらの構造でfriendlist
を持っているAndroidアプリ上で動作:Firebaseデータベースでアダプタのリストを更新するには?
{ 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
}
}
私はリサイクラービュー友達リストを表示したいと思います。私はそれを行い、それは動作します。私の断片で
:
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());
}
});
}
マイアダプタ:
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();
}
}
マイ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());
}
});
}}
しかし、今、私がめざし私のデータセットがDatabaseReference
オブジェクトではなく、User
オブジェクトを含んでいるので、uldはリスト内のユーザーを並べ替えるのが好きです。私は私のデータセットを構築する方法が悪いと思います。たとえば、ユーザーを名前で並べ替える方法を教えてください。
最初にわかるように、(フラグメント内の)自分のユーザーの友人をフェッチします。この友情で、私はDatabaseReference
のオブジェクト(各ユーザー)のデータセットを作成します。最後に、私のViewHolder
では、私は各ユーザーのデータを取得し、ビューに移入します。したがって、私は自分のデータセットにユーザー情報を追加することはありませんが、DatabaseReference
だけです。
ありがとうございます。
私はそれが重複しているとは思わない。私の問題は、データセットにDatabaseReferenceオブジェクトが含まれているときに、Userオブジェクトをソートする方法です。 – aurevec
アダプターに新しいデータを通知することは決してありません。これは現在何かを表示していますか? –
はい、データが表示されています。 – aurevec