Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未创建接收器视图_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 未创建接收器视图

Android 未创建接收器视图,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我首先检查消息是否被发送或接收,然后它为发送者和接收者创建相应的viewHolder public class MessageAdapter extends RecyclerView.Adapter{ Context context; ArrayList<Message> Messages; final int ITEM_SENT=1; final int ITEM_RECEiVE=2; public MessageAdapter(Context context, ArrayLis

我首先检查消息是否被发送或接收,然后它为发送者和接收者创建相应的viewHolder

public class MessageAdapter extends RecyclerView.Adapter{
Context context;
ArrayList<Message> Messages;
final int ITEM_SENT=1;
final int ITEM_RECEiVE=2;

public MessageAdapter(Context context, ArrayList<Message> messages) {
    this.context = context;
    Messages = messages;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if(viewType==ITEM_SENT){
        View view= LayoutInflater.from(context).inflate(R.layout.item_send,parent,false);
        return new SenderViewHolder(view);
    }
    else {
        View view= LayoutInflater.from(context).inflate(R.layout.item_receive,parent,false);
        return new ReceiverViewHolder(view);
    }

}


@Override
public int getItemViewType(int position) {
    Message message= Messages.get(position);
    if(FirebaseAuth.getInstance().getUid().equals(message.getSenderId()))
        return ITEM_SENT;
    else {
        return ITEM_RECEiVE;
    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    Message message=Messages.get(position);
        if (holder.getClass() == SenderViewHolder.class) {
            SenderViewHolder viewHolder = (SenderViewHolder) holder;
            viewHolder.send_message.setText(message.getMessage());
        } else {
            ReceiverViewHolder viewHolder = (ReceiverViewHolder) holder;
            viewHolder.receive_message.setText(message.getMessage());
        }
}

@Override
public int getItemCount() {
    return Messages.size();
}

public class SenderViewHolder extends RecyclerView.ViewHolder{
    private TextView send_message;
    private ImageView feeling;
    public SenderViewHolder(@NonNull View itemView) {
        super(itemView);
        send_message=itemView.findViewById(R.id.send_message);
        feeling=itemView.findViewById(R.id.feeling);
    }
}

public class ReceiverViewHolder extends RecyclerView.ViewHolder{
    private TextView receive_message;
    private ImageView feeling;
    public ReceiverViewHolder(@NonNull View itemView) {
        super(itemView);
        receive_message=itemView.findViewById(R.id.receive_message);
        feeling=itemView.findViewById(R.id.feeling);
    }
}
公共类MessageAdapter扩展了RecyclerView.Adapter{ 语境; ArrayList消息; 发送的最终int项目=1; 最终int项目接收=2; 公共消息适配器(上下文、ArrayList消息){ this.context=上下文; 消息=消息; } @非空 @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ 如果(viewType==已发送的项目){ 视图=布局更平坦。从(上下文)。充气(R.layout.item\u发送,父项,false); 返回新的SenderViewHolder(视图); } 否则{ 视图=布局更平坦。从(上下文)。充气(R.layout.item\u receive,parent,false); 返回新的接收人(视图); } } @凌驾 public int getItemViewType(int位置){ Message Message=Messages.get(位置); if(FirebaseAuth.getInstance().getUid().equals(message.getSenderId())) 返回已发送的项目; 否则{ 收到退货项目; } } @凌驾 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder,int位置){ Message Message=Messages.get(位置); if(holder.getClass()==SenderViewHolder.class){ SenderViewHolder=(SenderViewHolder)持有者; viewHolder.send_message.setText(message.getMessage()); }否则{ 接收人股东=(接收人股东)股东; viewHolder.receive_message.setText(message.getMessage()); } } @凌驾 public int getItemCount(){ 返回消息。size(); } 公共类SenderViewHolder扩展了RecyclerView.ViewHolder{ 私有文本视图发送消息; 私人形象、观感; public-SenderViewHolder(@NonNull-View-itemView){ 超级(项目视图); send_message=itemView.findviewbyd(R.id.send_message); feeling=itemView.findViewById(R.id.feeling); } } 公共类ReceiverViewHolder扩展了RecyclerView.ViewHolder{ 私有文本视图接收_消息; 私人形象、观感; 公共ReceiverViewHolder(@NonNull View itemView){ 超级(项目视图); receive_message=itemView.findviewbyd(R.id.receive_message); feeling=itemView.findViewById(R.id.feeling); } } }

然后我创建了一个聊天节点,在这里我存储发送者和接收者的消息,并使用快照从数据库中获取数据,并在执行其显示发送者的消息但不显示接收者的消息后将其存储在arraylist中

public class ChatActivity extends AppCompatActivity {
MessageAdapter adapter;
ArrayList<Message> messages;
String senderRoom,receiverRoom;
EditText chatBox;
FloatingActionButton chatSendBtn;
FirebaseDatabase database;
RecyclerView chatView;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    chatBox=findViewById(R.id.chatBox);
    chatSendBtn=findViewById(R.id.chatSendBtn);
    chatView=findViewById(R.id.chatView);
    messages=new ArrayList<>();
    adapter=new MessageAdapter(this,messages);
    chatView.setLayoutManager(new LinearLayoutManager(this));
    chatView.setAdapter(adapter);
    String name=getIntent().getStringExtra("name");
    String receiverUid=getIntent().getStringExtra("uid");
    final String senderUid= FirebaseAuth.getInstance().getUid();
    senderRoom=senderUid+receiverUid;
    receiverRoom=receiverRoom+senderUid;
    database=FirebaseDatabase.getInstance();

    database.getReference().child("chats")
            .child(senderRoom)
            .child("messages")
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    messages.clear();
                    for(DataSnapshot snapshot1 : snapshot.getChildren()) {
                        Message message = snapshot1.getValue(Message.class);
                        message.setMessageId(snapshot1.getKey());
                        messages.add(message);
                    }

                    adapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });



    chatSendBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String messageTxt = chatBox.getText().toString();

            Date date = new Date();
            final Message message = new Message(messageTxt, senderUid, date.getTime());
            chatBox.setText("");
            database.getReference().child("chats")
                    .child(senderRoom)
                    .child("messages")
                    .push()
                    .setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            database.getReference().child("chats")
                                    .child(receiverRoom)
                                    .child("messages")
                                    .push()
                                    .setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {

                                }
                            });
                }
            });
        }
    });
公共类ChatActivity扩展了AppCompatActivity{
消息适配器;
ArrayList消息;
字符串发送室、接收室;
编辑文本聊天盒;
浮动操作按钮chatSendBtn;
Firebase数据库;
回收视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
chatBox=findviewbyd(R.id.chatBox);
chatSendBtn=findviewbyd(R.id.chatSendBtn);
chatView=findViewById(R.id.chatView);
messages=newarraylist();
adapter=新的MessageAdapter(此,消息);
setLayoutManager(新的LinearLayoutManager(this));
setAdapter(适配器);
字符串名称=getIntent().getStringExtra(“名称”);
字符串receiverUid=getIntent().getStringExtra(“uid”);
最后一个字符串senderUid=FirebaseAuth.getInstance().getUid();
senderRoom=senderUid+ReceiveUID;
receiverRoom=receiverRoom+senderUid;
database=FirebaseDatabase.getInstance();
database.getReference().child(“聊天”)
.child(senderRoom)
.child(“消息”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
messages.clear();
对于(DataSnapshot snapshot1:snapshot.getChildren()){
Message Message=snapshot1.getValue(Message.class);
message.setMessageId(snapshot1.getKey());
消息。添加(消息);
}
adapter.notifyDataSetChanged();
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
chatSendBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最后一个字符串messageTxt=chatBox.getText().toString();
日期=新日期();
最终消息消息=新消息(messageTxt,senderUid,date.getTime());
chatBox.setText(“”);
database.getReference().child(“聊天”)
.child(senderRoom)
.child(“消息”)
.push()
.setValue(message).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
database.getReference().child(“聊天”)
.儿童(接管室)
.child(“消息”)
.push()
.setValue(message).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
}
});
}
});
}
});

您需要更新适配器:

adapter.setItems(messages);
adapter.notifyDataSetChanged();

您是否已使用日志检查了OnCreateViewHolder()中是否正确运行了其他日志