やりたいこと
Firebaseにある特定のデータを取得してRecyclerViewに表示したいです。
具体的には、Realtime Database上でFirebaseAuthのuidを持つuserを探し、そのuserが持っているfriendsの一覧を表示したいです。
問題と質問
できるにはできたのですが、あまりにも無理矢理な感が強く、とても正しい方法だと思えません。
もっと良い方法を教えて頂きたいと思っています。
現在のコード
- Firebase Realtime Database
json
1{ 2 "users" : { 3 "userkey01" : { // push()すると作られる固有のキーです 4 "friends" : { 5 "userkey02" : "user2name" // このユーザーのフレンドがfirebase上のキーとnameの値で格納されています 6 }, 7 "name" : "user1", 8 "uid" : "user1uid" // FirebaseAuthのUIDです 9 }, 10 "userkey02" : { 11 "friends" : { 12 "userkey01" : "user1name" 13 }, 14 "name" : "user2", 15 "uid" : "user2uid" 16 } 17 } 18}
- Fragmentのコード抜粋
kotlin
1override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 2 val view = inflater!!.inflate(R.layout.fragment_friend, container, false) 3 4 val recyclerView = view.friend_recycler 5 recyclerView.layoutManager = LinearLayoutManager(activity) 6 7 val array = ArrayList<String>() // このArrayListにfriendのnameが入ります 8 9 val databaseRef: DatabaseReference = FirebaseDatabase.getInstance().reference 10 val currentUserUid = FirebaseAuth.getInstance().currentUser!!.uid 11 12 // 現在ログインしているユーザーのuidから、それを持つノードを検索しています 13 val currentUserRef = databaseRef.child(FirebaseEntityName.USER).orderByChild("uid").equalTo(currentUserUid) 14 15 // 検索したユーザーのノードを一度だけ取得します 16 currentUserRef.addListenerForSingleValueEvent(object : ValueEventListener { 17 override fun onDataChange(p0: DataSnapshot?) { 18 19 // 見つかっていればfirstChildにノードが入るはずなので、格納します 20 val firstChild = p0!!.children.iterator().next() 21 22 // 見つかったuserのkeyを使用して、userの持つfriendsの参照を取得します 23 var friends = databaseRef.child(FirebaseEntityName.USER).child(firstChild.key).child("friends") 24 25 // friendsのデータを取得します 26 friends.addListenerForSingleValueEvent(object : ValueEventListener { 27 28 override fun onDataChange(p0: DataSnapshot?) { 29 30 // 見つかっていれば格納します 31 // 現在データが一つしかありませんが、複数の予定なので、iteratorを使ってループで回すことになると思います。 32 val firstChild = p0!!.children.iterator().next() 33 34 // ArrayListに名前を追加して、notifyItemChanged()でrecyclerViewに変更を通知します 35 array.add(firstChild.value) 36 recyclerView.adapter.notifyItemChanged(array.size - 1) 37 } 38 39 override fun onCancelled(p0: DatabaseError?) { 40 Log.d("cancelled", "cancelled") 41 } 42 }) 43 } 44 45 override fun onCancelled(p0: DatabaseError?) { 46 Log.d("cancelled", "cancelled") 47 } 48 }) 49 50 val itemDecoration = DividerItemDecoration(activity, DividerItemDecoration.VERTICAL) 51 recyclerView.addItemDecoration(itemDecoration) 52 53 recyclerView.adapter = FriendAdapter(activity,array) 54 return view 55 }
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。