RecyclerView notifyDataSetChanged()不起作用

时间:2018-08-15 14:55:37

标签: android firebase android-recyclerview chat

我正在将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) {

                    }
                });
            }
        });
    }
});

过程就是这样。

  1. 使用“注释”对象形式将消息数据存储到Firebase数据库中。
  2. 如果阶段1成功,则获取该消息并致电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();
    }
}

我该如何解决?

1 个答案:

答案 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()的方式。

祝你好运!