Android 未创建接收器视图
我首先检查消息是否被发送或接收,然后它为发送者和接收者创建相应的viewHolderAndroid 未创建接收器视图,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
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()中是否正确运行了其他日志