java - 使用 Cloud Firestore 向其他用户发送或接收的消息填充 Fragment

标签 java android firebase google-cloud-firestore

我目前正在为租赁移动应用程序进行聊天。目前,我已将我的应用程序与云 Firestore 链接,一旦不同用户注册,我就可以发送和接收来自他们的消息!

我目前无法破解的问题是我正在尝试使用发送者/接收者已发送或接收的消息填充此 chatFragment.java 类。我相信我走在正确的轨道上,但是当我尝试查询快照时,它一直说我需要将其声明为“执行者”。

任何帮助都会很棒!干杯!

chatFragment.java

public class chatFragment extends Fragment {

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private RecyclerView recyclerView;
    private userAdapter userAdapter;
    private List<User> mUsers;

    private FirebaseUser firebaseUser;
    private CollectionReference notebookRef ;

    private List<String> userList;

    public chatFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_chat, container, false);


        recyclerView = view.findViewById(R.id.chat_view_recycler);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));


        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        userList = new ArrayList<>();

        notebookRef = db.collection("Chats");



> notebookRef.addSnapshotListener( chatFragment.this, new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

                userList.clear();
                if(!documentSnapshots.isEmpty())
                {
                    for(DocumentChange doc:documentSnapshots.getDocumentChanges())
                    {
                        Chat obj = doc.getDocument().toObject(Chat.class);

                        if(obj.getSender().equals(firebaseUser.getUid()))
                        {
                            userList.add(obj.getReceiver());
                        }
                        if(obj.getReceiver().equals(firebaseUser.getUid()))
                        {
                            userList.add(obj.getSender());
                        }

                    }

                    readChats();
                }
            }
        });

        return view;
    }

    private void readChats() {

        mUsers = new ArrayList<>();

        notebookRef = db.collection("Chats");

        notebookRef.addSnapshotListener((Executor) chatFragment.this, new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

                userList.clear();


                for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
                    User obj = doc.getDocument().toObject(User.class);

                    for (String id : userList) {
                        if (obj.getUserName().equals(id)) {
                            if (mUsers.size() != 0) {
                                for (User userUI : mUsers) {
                                    if (!obj.getUserName().equals(userUI.getUserName())) {
                                        mUsers.add(obj);
                                    }
                                }
                            } else {
                                mUsers.add(obj);
                            }
                        }
                    }
                }

                Query query = notebookRef.orderBy("userId", Query.Direction.DESCENDING);
                FirestoreRecyclerOptions<User> options = new FirestoreRecyclerOptions.Builder<User>()
                        .setQuery(query, User.class)
                        .build();
                userAdapter = new userAdapter(options);
                recyclerView.setAdapter(userAdapter);
            }
        });

    }
}

消息适配器

public class userAdapter extends FirestoreRecyclerAdapter<User,userAdapter.UserViewHolder> {

    public userAdapter( FirestoreRecyclerOptions<User> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull UserViewHolder holder,final int position, @NonNull User model) {
        holder.list_studentNumber.setText(model.getStudentNumber());
        holder.list_userName.setText(model.getUserName());
        holder.list_admin.setText(String.valueOf(model.isAdmin()));
        Picasso.get().load(model.getPhotoUrl()).fit().centerCrop().into(holder.list_photo);
        Log.d("USERIDaaaaa", model.getUserName());

    }



    @NonNull
    @Override
    public UserViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.format_users_value, parent, false);
        return new UserViewHolder(v);
    }

    class UserViewHolder extends RecyclerView.ViewHolder {

        TextView list_admin;
        ImageView list_photo;
        TextView list_studentNumber;
        TextView list_userName;

        public UserViewHolder(final View itemView) {
            super(itemView);

            list_admin = itemView.findViewById(R.id.list_admin);
            list_photo = itemView.findViewById(R.id.list_photo);
            list_studentNumber = itemView.findViewById(R.id.list_studentNumber);
            list_userName = itemView.findViewById(R.id.list_userName);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(itemView.getContext(), message_between_users.class);
                    itemView.getContext().startActivity(intent);
                }
            });
        }
    }
}

User.java


public class Chat implements Serializable {

        private String sender;
        private String receiver;
        private String message;
        private String Type;
        private Date Time;




    public Chat() {
            //empty constructor needed
        }

        public Chat(String sender, String receiver, String message, Date Time, String Type ) {
            this.sender = sender;
            this.receiver = receiver;
            this.message = message;
            this.Time = Time;
        }

        public String getSender() {
            return sender;
        }

        public void setSender(String sender) {
            this.sender = sender;
        }

        public String getReceiver() {
            return receiver;
        }

        public void setReceiver(String receiver) {
            this.receiver = receiver;
        }

        public String getType() { return Type; }

        public void setType(String type) { Type = type; }

        public Date getTime() { return Time; }

        public void setTime(Date time) { Time = time; }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }

运行时错误消息

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.clubapp, PID: 28835
    java.lang.ClassCastException: com.example.clubapp.chatFragment cannot be cast to java.util.concurrent.Executor
        at com.example.clubapp.chatFragment.onCreateView(chatFragment.java:65)

最佳答案

addSnapshotListener 有 3 个重载需要两个参数:

  1. addSnapshotListener(Activity activity, EventListener<QuerySnapshot> listener)
  2. addSnapshotListener(MetadataChanges metadataChanges, EventListener<QuerySnapshot> listener)
  3. addSnapshotListener(Executor executor, EventListener<QuerySnapshot> listener)

这些重载都不需要 Fragment作为其第一个参数,因此编译器不知道要调用什么重载。

您可能正在尝试调用第一个重载,以便监听器的范围仅限于 Activity 。但在这种情况下,您需要传递 Activity ,而不是 fragment 。

这实际上是一个有趣的想法,还允许自动将监听器范围限定为 fragment ,因此您可能需要 file a feature request为此。

<小时/>

通常不需要为监听器传递执行程序,除非您需要控制 Firebase 运行其网络和磁盘 I/O 的线程。在所有其他情况下,请像这样附加监听器:

notebookRef.addSnapshotListener(new EventListener<QuerySnapshot>() {
  ...

关于java - 使用 Cloud Firestore 向其他用户发送或接收的消息填充 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60857572/

相关文章:

java - 如何从xml文件中获取属性?

java - 如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?

ios - Firebase 扇出数据以更新特定字段删除其他兄弟字段

javascript - Firebase 根据子值删除节点

java - 使用基于数据库的 ID 生成器 "Sequence"或 "Table HiLow"

java - 快速 Swing 问题 : Need to shut down my database on close

java - @Pathvariable 的 UrlMapping 通配符

android - 垂直滚动条与水平滚动 Android

android - 程序类型已经存在 : com. google.common.annotations.Beta

android - java.lang.ClassCastException : java. util.HashMap 无法转换为 Ride