Заполнение фрагмента сообщениями, отправленными или полученными другими пользователями с помощью Cloud Firestore - PullRequest
0 голосов
/ 26 марта 2020

Я сейчас нахожусь в процессе создания чата для аренды мобильного приложения. В настоящее время я связал свое приложение с облачным 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);
            }
        });

    }
}

MessageAdapter

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

Пользователь. 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)

1 Ответ

1 голос
/ 26 марта 2020

Существует три перегрузки addSnapshotListener, которые принимают два аргумента:

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

Ни одна из этих перегрузок не принимает Fragment в качестве первого аргумента, поэтому компилятор не знает, какую перегрузку вызвать.

Возможно, вы пытаетесь вызвать первую перегрузку, так что слушатель становится ограниченным для деятельности. Но в этом случае вам нужно перейти к действию, а не к фрагменту.

На самом деле это интересная идея - также разрешить автоматическое определение области прослушивателя для фрагмента, поэтому вы можете подать запрос функции для этого.


Есть как правило, нет необходимости передавать исполнителя для слушателя, если только у вас нет необходимости контролировать, в каком потоке Firebase запускает свою сеть и дисковый ввод-вывод. Во всех остальных случаях прикрепляйте слушателей так:

notebookRef.addSnapshotListener(new EventListener<QuerySnapshot>() {
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...