当前位置: 首页 > 知识库问答 >
问题:

Firestore回收器适配器-滚动后项目消失

秦权
2023-03-14

我正在尝试为我的项目创建聊天服务,为了做到这一点,我将我的消息存储在我从服务器获取的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);
        }
    }
}

在这样做之后:

共有1个答案

莫选
2023-03-14

请尝试在else语句中的回调侦听器中移动设置holder成员的代码的blow块。

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" );                    }
                });

        }
        }
 类似资料:
  • 我正在寻找在Android中使用列表适配器和Recyview适配器的区别。关于性能的任何不同,使用它们的利弊。

  • 我无法填充Firebase回收适配器。我最终想做的是,用户搜索一个名称,数据库中的结果将填充回收人员视图。 数据库结构如下所示: 要填充的代码如下所示,全部位于: 现在我只想让它填充数据库中的所有用户,但似乎什么都没有填充。 是一个。 这是UsersViewHolder类:公共静态类UsersViewHolder扩展了RecyclerView。视图持有者{View mView;TextView m

  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 变量'viewholder'、'position'&model'是从内部类访问的,它需要声明为final,但当我将其声明为final时,在适配器中显示错误。我正在使用Firebase 11.2.0请帮助我

  • 我想从我的回收器视图中的给定项目位置获取视图,但持有者总是为空,我不知道为什么。

  • 我正在使用下面的代码创建一个回收器视图。recyclerview有一个网格布局管理器,其项计数最多为每行2个。 不幸的是,我嵌套在ConstraintLayout中的回收器视图根本没有滚动。我错过了什么?约束布局是否支持相同的?