java - Firestore 回收器适配器 - 滚动后消失的项目
问题描述
我正在尝试为我的项目创建聊天服务,为此,我将消息存储在从服务器获取的 Firestore 数据库中,并分配将发件人 ID 与当前用户 ID 进行比较的文本。当我开始活动时,消息会正确显示,但是当我向下滚动时,我的消息会停止显示,或者其他用户的消息会消失,这取决于是否打开了聊天帐户。
我似乎无法弄清楚为什么会发生这种情况。
我的 readMessages 函数:
private void readMessages(){
Query query = DataRef.collection("rooms").document(roomID).collection("messages").orderBy("timestamp", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<MessageModel> options = new FirestoreRecyclerOptions.Builder<MessageModel>().setQuery(query, MessageModel.class).build();
adapter = new FirestoreRecyclerAdapter<MessageModel, MessageAdapter.ViewHolder>(options) {
@Override
protected void onBindViewHolder(MessageAdapter.ViewHolder holder, int position, MessageModel model) {
if (myUid.equals(model.getUid())) {
Log.d(TAG, "status1");
holder.msg_right.setText(String.valueOf(model.getMsg()));
holder.msg_left.setVisibility(View.INVISIBLE);
holder.profile_image.setVisibility(View.INVISIBLE);
holder.msg_nick.setVisibility(View.INVISIBLE);
}
else
{
DataRef.collection("users").document(String.valueOf(model.getUid())).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
DocumentSnapshot document = task.getResult();
msgNick = document.getString("usernm");
}
});
holder.msg_nick.setText(msgNick);
holder.msg_left.setText(String.valueOf(model.getMsg()));
holder.msg_right.setVisibility(View.INVISIBLE);
Log.d(TAG, "status0" );
}
}
@NonNull
@Override
public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message,parent,false);
return new MessageAdapter.ViewHolder(v);
}
};
adapter.startListening();
recyclerView.setAdapter(adapter);
}
我的消息适配器类:
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView msg_right;
public ImageView profile_image;
public TextView msg_left;
public TextView msg_nick;
public ViewHolder(View itemView) {
super(itemView);
msg_right = itemView.findViewById(R.id.msg_right);
profile_image = itemView.findViewById(R.id.msg_leftavatar);
msg_left = itemView.findViewById(R.id.msg_left);
msg_nick = itemView.findViewById(R.id.msg_nick);
}
}
}
向下和向上滚动之前的聊天状态:
这样做之后:
解决方案
请尝试在语句中移动holder
回调监听器中设置成员的代码块。else
private void readMessages(){
Query query = DataRef.collection("rooms").document(roomID).collection("messages").orderBy("timestamp", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<MessageModel> options = new FirestoreRecyclerOptions.Builder<MessageModel>().setQuery(query, MessageModel.class).build();
adapter = new FirestoreRecyclerAdapter<MessageModel, MessageAdapter.ViewHolder>(options) {
@Override
protected void onBindViewHolder(MessageAdapter.ViewHolder holder, int position, MessageModel model) {
if (myUid.equals(model.getUid())) {
Log.d(TAG, "status1");
holder.msg_right.setText(String.valueOf(model.getMsg()));
holder.msg_left.setVisibility(View.INVISIBLE);
holder.profile_image.setVisibility(View.INVISIBLE);
holder.msg_nick.setVisibility(View.INVISIBLE);
}
else
{
DataRef.collection("users").document(String.valueOf(model.getUid())).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
DocumentSnapshot document = task.getResult();
msgNick = document.getString("usernm");
holder.msg_nick.setText(msgNick);
holder.msg_left.setText(String.valueOf(model.getMsg()));
holder.msg_right.setVisibility(View.INVISIBLE);
Log.d(TAG, "status0" ); }
});
}
}
推荐阅读
- angular - 如果 1 秒内没有响应,如何添加到数组中?
- php - 如何查找并将两行合并为一
- maven - 使用 Maven 进行基于 Trunk 的开发
- python-3.x - 加入命令的回调缺少“ctx”参数
- go - 结构类型中的条件/可选字段
- javascript - JS - 向一个变量添加键会将其添加到在链式赋值中创建的所有变量中
- algorithm - 前缀和变化
- javascript - 如何确定拖动是否在不同的浏览器选项卡中开始
- pandas - 生成的 DataFrame 切片的长度大于 .loc[] 属性的参数中提供的标签列表的长度
- regex - 如何在re python中匹配带有星号(*)的模式?