2016-11-01 5 views
0

は、私は、ユーザーが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だけです。

ありがとうございます。

+0

私はそれが重複しているとは思わない。私の問題は、データセットにDatabaseReferenceオブジェクトが含まれているときに、Userオブジェクトをソートする方法です。 – aurevec

+0

アダプターに新しいデータを通知することは決してありません。これは現在何かを表示していますか? –

+0

はい、データが表示されています。 – aurevec

答えて

0

このようにデータベースから取得中にデータを並べ替えることができます。

// 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 
// ... 
}); 

このリンクをthrought行ってください、あなたは、ユーザーオブジェクトにDatabaseReferenceを変換することはできませんソートデータ

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

+0

これはできません。なぜなら、ユーザー情報を含まない友だちからデータを取得するのではなく、IDだけです。 – aurevec

+0

データベースを照会して任意の種類のデータを並べ替えることができます –

0

のためのより多くの情報を見つけることができます。あなたは、getValueを使ってDataSnapshotをUserオブジェクトに変換することができます。

冗長性を追加するためにデータをどのように格納するかを変更する必要があります。 NoSQLデータベースには、あなたがしようとしているような非正規化データを格納する方法はありません。

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

その後、ユーザーの友人のリストを得るためにあなたのQueryを変更することができます。

あなたのデータは、このようなものに見えるかもしれません。

これはデータを整理する唯一の方法ではなく、単なる例です。それは、データをどのようにクエリしたいかによって異なります。

+0

各ユーザーには他のフィールドがあり、リアルタイムで表示および表示します。フィールドが変更されているときに友人のすべてのユーザーを更新することはできません。そのために、私はこの現在のデータ構造を使用します。 – aurevec

+0

私はあなたのデータ構造を変更することなく、いかなる解決策も考えることはできません。多分あなたは 'friendships'属性を次のように変更することができます:'友情:{ user_1:{ user_2:{name:...}、 user_3:{名前:...}、 user_3:{ user_1 {name:...}、 user_2:{name:...} } } ' – rubenlop

+0

ここで重要な点は、表示する必要があるすべてのデータを1つの' Query'を使って取得する必要があることです。 – rubenlop

関連する問題