我正在将firebase用于聊天应用程序,并且正在实现从firebase数据库中获取消息并更新回收者视图。
当我单击“发送”按钮时,其行为如下所示。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final ChatModel.Comment comment = new ChatModel.Comment();
comment.uid = uid;
comment.message = editText.getText().toString();
FirebaseDatabase.getInstance().getReference().child("chatrooms")
.child(chatroomUid).push().setValue(comment).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
FirebaseDatabase.getInstance().getReference().child("chatrooms")
.child(chatroomUid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
comments.clear();
for(DataSnapshot item : dataSnapshot.getChildren()) {
if(item.getKey().compareTo("users")!=0) {
comments.add(item.getValue(ChatModel.Comment.class));
}
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
});
过程就是这样。
notifyDataSetChanged()
但是它不起作用,我有全局adpater对象,并且上述方法是通过此变量调用的。
适配器代码如下。
private class messageRecyclerveiwAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_message, viewGroup, false);
return new MessageViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
((MessageViewHolder)viewHolder).textView.setText(comments.get(i).message);
}
@Override
public int getItemCount() {
return comments.size();
}
}
我该如何解决?
答案 0 :(得分:0)
您需要在与setOnClickListener相同的类中创建适配器的对象:
类似的事情:
final MessageRecyclerViewAdapter adapter = new MessageRecyclerViewAdapter(getActivity(), messageArrayList);
然后,您需要将适配器传递给用于获取消息的方法。目前,您正在适配器中调用notifyDataSetChanged()
,这是错误的。首先,您需要一种特定的方法来从Firebase获取这些消息。例如:
public void getLiveChatMessages(final ArrayList<ChatMessageClass> messageArrayList, final MessageRecyclerViewAdapter adapter) {
我猜你有一个返回消息的不同部分的类。这就是我在这里命名为“ ChatMessageClass”的东西,但是你可以用别的名字来称呼它。在此方法中,您将从Firebase获取消息,然后在该方法中最后调用:
adapter.notifyDataSetChanged();}
在getLiveChatMessages方法中。在这里,您还可以传入适配器,以便可以使用它。这是在与获取消息相同的方法中调用notifyDataSetChanged()
的方式。
祝你好运!