2017-12-24 4 views
0

채팅 목록을 표시하는 데 사용되는 FirebaseRecyclerAdapter이 있습니다. 는 이제 모든 채팅을 표시하고 나는 그것이 "사용자"배열에 현재 중포 기지 사용자 ID를 포함하는 경우에만 채팅 보여주고 싶은 :FirebaseRecyclerAdapter의 데이터 필터링

enter image description here

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().reference 

    val parser = SnapshotParser<ChatModel> { dataSnapshot -> 
      val chat = dataSnapshot.getValue(ChatModel::class.java) 
      if (chat != null) { 
       chat.id = dataSnapshot.key 
      } 
      chat 
     } 

    val chatsRef = mFirebaseDatabaseReference.child(ChatActivity.ROOMS_CHILD) 
    val options = FirebaseRecyclerOptions.Builder<ChatModel>() 
      .setQuery(chatsRef, parser) 
      .build() 

    mFirebaseAdapter = object : FirebaseRecyclerAdapter<ChatModel, ChatViewHolder>(options) { 

     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder { 
      val inflater = LayoutInflater.from(parent.context) 
      val viewHolder = ChatViewHolder(inflater.inflate(R.layout.item_chat, parent, false)) 
      return viewHolder 
     } 

     override fun onBindViewHolder(viewHolder: ChatViewHolder, 
             position: Int, 
             chatItem: ChatModel) { 
     } 
    } 

나는이 방법 SnapshotParser 내부 데이터를 필터링하는 생각을했다을 :

val parser = SnapshotParser<ChatModel> { dataSnapshot -> 
val chat = dataSnapshot.getValue(ChatModel::class.java) 
if (chat != null && chat.users.contains(mFirebaseUser?.uid)){ // I want to add this condition 
    chat.id = dataSnapshot.key 
    chat 
} else { 
    null 
} 

}

하지만이 중포 기지 클래스 중 하나에 NPE가 발생합니다. 현재 사용자가 채팅을 필터링하는 가장 좋은 방법은 무엇입니까?

답변

0

This method@NonNull으로 주석을 달았으므로 파서가 null 값을 반환 할 것으로 예상되지 않습니다.

두 가지 옵션이 마음에 와서 :

가) FirebaseUI-Android를 사용하지 마십시오. 필터링 결과는 일반 어댑터를 사용하여 가능하며 예를 들어 아이들 대신 값을 요청하고 DiffUtil을 사용하여 변경 사항을 계산할 수 있습니다. 그러나 그것을 할 수있는 다른 방법이 있습니다!

b) 데이터를 재구성하십시오. 예를 들어,이 사용자가 속한 채팅의 키를 보유하는 각 사용자에 대한 별도의 콜렉션을 가질 수 있습니다.

다른 방법이있을 수 있지만 질문을 읽으면서 마음에 들었습니다. 희망이 도움이!