database - 不显示朋友的消息。onBindViewHolder 中的 ReceiverViewHolder 存在问题
问题描述
我在那里发送消息并从 Firebase 获取它们:
/ ChatActivity /
公共类 MainActivity 扩展 AppCompatActivity {
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("messages");
EditText messageField;
private FirebaseAuth mAuth;
RecyclerView list_of_messages;
TextView message_user;
String senderUid;
String receiverUid;
ArrayList<Message> messages;
String senderRoom, receiverRoom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String name = getIntent().getStringExtra("name");
String uid = getIntent().getStringExtra("uid");
FloatingActionButton btn =
(FloatingActionButton) findViewById(R.id.btnSend);
messages = new ArrayList<>();
messageField = findViewById(R.id.messageField);
list_of_messages = findViewById(R.id.list_of_messages);
DatabaseReference myRef = database.getReference("chats");
DataAdapter dataAdapter = new DataAdapter(this, messages, senderRoom, receiverRoom);
senderUid = FirebaseAuth.getInstance().getUid();
receiverUid = getIntent().getStringExtra("uid");
senderRoom = senderUid + receiverUid;
receiverRoom = receiverUid + senderUid;
LinearLayoutManager lin = (new LinearLayoutManager(this));
lin.setStackFromEnd(true);
list_of_messages.setLayoutManager(lin);
list_of_messages.setAdapter(dataAdapter);
TextView item_receive = findViewById(R.id.messageR);
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);
messages.add(message);
}
dataAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String messageTxt = messageField.getText().toString();
Date date = new Date();
Message messages = new Message(messageTxt, senderUid, date.getTime());
messageField.setText("");
String randomKey = database.getReference().push().getKey();
HashMap<String, Object> lastMsgObj = new HashMap<>();
lastMsgObj.put("lastMsg", messages.getMsg());
lastMsgObj.put("lastMsgTime", date.getTime());
database.getReference().child("chats").child(senderRoom).updateChildren(lastMsgObj);
database.getReference().child("chats").child(receiverRoom).updateChildren(lastMsgObj);
database.getReference().child("chats")
.child(senderRoom)
.child("messages")
.child(randomKey)
.setValue(messages).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
database.getReference().child("chats")
.child(receiverRoom)
.child("messages")
.child(randomKey)
.setValue(messages).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
});
}
});
}
});}}
当我尝试在 onBindViewHolder 中仅使用具有此类上下文的 ReceiverViewHolder 时出现错误:无法将 SendViewHolder 转换为 ReceiverViewHolder !!!!!!
/ MessageAdapter /公共类 DataAdapter 扩展 RecyclerView.Adapter {
Context context;
ArrayList<Message> messages;
final int ITEM_SENT = 1;
final int ITEM_RECEIVE = 2;
String senderRoom;
String receiverRoom;
public DataAdapter(Context context, ArrayList<Message> messages, String senderRoom, String receiverRoom) {
this.context = context;
this.messages = messages;
this.senderRoom = senderRoom;
this.receiverRoom = receiverRoom;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if(viewType == ITEM_SENT) {
View view = LayoutInflater.from(context).inflate(R.layout.item_sent, parent, false);
return new SentViewHolder(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() == SentViewHolder.class) {
SentViewHolder viewHolder = (SentViewHolder)holder;
viewHolder.message.setText(message.getMsg());
} else {
ReceiverViewHolder viewHolder = (ReceiverViewHolder)holder;
viewHolder.messageR.setText(message.getMsg());
}}
@Override
public int getItemCount() {
return messages.size();
}
public class ReceiverViewHolder extends RecyclerView.ViewHolder {
TextView messageR;
public ReceiverViewHolder(@NonNull View itemView) {
super(itemView);
messageR = itemView.findViewById(R.id.messageR);
}
}
public class SentViewHolder extends RecyclerView.ViewHolder {
TextView message;
public SentViewHolder(@NonNull View itemView) {
super(itemView);
message = itemView.findViewById(R.id.message);
}
}}
解决方案
推荐阅读
- php - 如何修复解析错误语法错误,意外'"',期望','或')'
- javascript - React 动态导入不接受字符串变量
- java - 如何读取耳朵包内文件夹中的所有文件
- python - wireshark 命令 - 蟒蛇
- r - 如何执行构建为字符串的命令
- php - 如果 echo 为空,则不显示
- c++ - c++对象内存分配
- c# - 反序列化 json 失败并出现 IConfigurationSection
- php - 如何在 Moodle 2.6 中更改评分方法下拉列表的值
- android-gradle-plugin - 重复类 android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat