Всякий раз, когда данные добавляются в базу данных реального времени Firebase, они печатаются со всеми предыдущими данными. - PullRequest
0 голосов
/ 15 марта 2020

В случае ошибки.

Я создаю приложение чата с firebase. куда я отправляю и печатаю данные из базы данных Firebase Realtime. проблема заключается в том, что всякий раз, когда я добавляю или отправляю данные в базу данных Firebase Realtime, это не только печатает добавленные в данный момент данные, но и снова и снова выводит данные целиком из узла Chats, где бы ни добавлялись какие-либо данные в базу данных Firebase Realtime.

как я могу это исправить?

Что я думаю, чтобы решить эту ошибку?

Я думаю, что удаление прослушивателя событий, которые присоединяются при вызове getMessage(); может исправить ошибку.

Это мой ChatActivity

package com.socialcodia.sherewatan;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.socialcodia.sherewatan.adapter.ChatAdapter;
import com.socialcodia.sherewatan.model.ChatModel;
import com.socialcodia.sherewatan.storage.Constants;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ChatActivity extends AppCompatActivity {

    Toolbar toolbar;

    private EditText inputMessage;
    private ImageButton btnSendMessage;
    private TextView toolbarUserName, toolbarUserStatus;
    private ImageView toolbarUserImage;

    //Firebase
    FirebaseAuth firebaseAuth;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference  databaseReference;
    DatabaseReference chatDatabaseReference;
    FirebaseUser firebaseUser;

    RecyclerView chatRecyclerView;
    Intent intent;
    String toUid;
    String myUid;

    List<ChatModel> chatList;
    ChatAdapter chatAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        //init Chat Recycler View
        chatRecyclerView = findViewById(R.id.chatRecyclerView);

        //set layout manager at chatRecyclerview
        LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        chatRecyclerView.setLayoutManager(layoutManager);

        //Firebase Init
        firebaseAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = firebaseDatabase.getReference("Users");
        chatDatabaseReference = firebaseDatabase.getReference("Chats");
        firebaseUser =firebaseAuth.getCurrentUser();

        //Init
        inputMessage = findViewById(R.id.inputMessage);
        btnSendMessage = findViewById(R.id.btnSendMessage);
        toolbarUserName = findViewById(R.id.toolbarUserName);
        toolbarUserStatus = findViewById(R.id.toolbarUserStatus);
        toolbarUserImage = findViewById(R.id.toolbarUserImage);

        toolbar = findViewById(R.id.chat_toolbar);
        setSupportActionBar(toolbar);

        intent = getIntent();

        //Data From intent
        toUid = intent.getStringExtra("uid");



        //Click listener on btn send message
        btnSendMessage.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                ValidateAndSendMessage();
            }
        });

        getMessage();

    }

    private void ValidateAndSendMessage()
    {
        String message = inputMessage.getText().toString().trim();
        if (message.isEmpty())
        {
            Toast.makeText(this, "Can't send empty message", Toast.LENGTH_SHORT).show();
        }
        else
        {
            sendMessage(message);
        }
    }

    private void sendMessage(String message)
    {
        HashMap<String, Object> map = new HashMap<>();
        map.put("msg",message);
        map.put(Constants.TIMESTAMP,System.currentTimeMillis()/1000);
        map.put("fromUid",myUid);
        map.put("toUid",toUid);
        DatabaseReference chatRef = firebaseDatabase.getReference("Chats");
        chatRef.push().setValue(map);
        inputMessage.setText("");
    }

    private void getMessage()
    {
        chatList = new ArrayList<>();
        final DatabaseReference chatRef = firebaseDatabase.getReference("Chats");
        chatRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren())
                {
                    ChatModel chatModel = ds.getValue(ChatModel.class);
                    if (chatModel.getFromUid().equals(myUid) && chatModel.getToUid().equals(toUid) ||
                    chatModel.getFromUid().equals(toUid) && chatModel.getToUid().equals(myUid))
                    {
                        chatList.add(chatModel);
                    }
                    chatAdapter = new ChatAdapter(chatList,getApplicationContext());
                    chatAdapter.notifyDataSetChanged();
                    chatRecyclerView.setAdapter(chatAdapter);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }


}

Это мой ChatAdapter.class

package com.socialcodia.sherewatan.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.socialcodia.sherewatan.R;
import com.socialcodia.sherewatan.model.ChatModel;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ChatViewHolder> {

    List<ChatModel> modelClassList;
    Context context;
    private static  final int MSG_TYPE_RIGHT = 0;
    private static final int MSG_TYPE_LEFT = 1;

    FirebaseUser firebaseUser;
    public ChatAdapter(List<ChatModel> modelClassList, Context context) {
        this.modelClassList = modelClassList;
        this.context = context;
    }

    @NonNull
    @Override
    public ChatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType==MSG_TYPE_RIGHT)
        {
            View view = LayoutInflater.from(context).inflate(R.layout.chat_right,parent,false);
            ChatViewHolder viewHolder = new ChatViewHolder(view);
            return viewHolder;
        }
        else
        {
            View view = LayoutInflater.from(context).inflate(R.layout.chat_left,parent,false);
            ChatViewHolder viewHolder = new ChatViewHolder(view);
            return viewHolder;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull ChatViewHolder holder, int position) {
        String msg = modelClassList.get(position).getMsg();
        Long timestamp = modelClassList.get(position).getTimestamp();
        holder.tvChatMessage.setText(msg);
        holder.tvChatTime.setText(getTime(timestamp));
    }

    private String getTime(Long timestamp) {
        Long ts = timestamp*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:a");
        String time = sdf.format(new Date(ts));
        return time;
    }


    @Override
    public int getItemCount() {
        return modelClassList.size();
    }

    @Override
    public int getItemViewType(int position) {
        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        if (modelClassList.get(position).getFromUid().equals(firebaseUser.getUid()))
        {
            return MSG_TYPE_RIGHT;
        }
        else
        {
            return MSG_TYPE_LEFT;
        }
    }

    public class ChatViewHolder extends RecyclerView.ViewHolder
    {

        private TextView tvChatMessage, tvChatTime;
        public ChatViewHolder(@NonNull View itemView) {
            super(itemView);
            tvChatMessage = itemView.findViewById(R.id.tvChatMessage);
            tvChatTime = itemView.findViewById(R.id.tvChatTime);
        }
    }
}

Это мой ChatModel.class

package com.socialcodia.sherewatan.model;

public class ChatModel {
    public String fromUid, toUid, msg;
    Long timestamp;

    public ChatModel() {
    }

    public ChatModel(String fromUid, String toUid, String msg, Long timestamp) {
        this.fromUid = fromUid;
        this.toUid = toUid;
        this.msg = msg;
        this.timestamp = timestamp;
    }

    public String getFromUid() {
        return fromUid;
    }

    public void setFromUid(String fromUid) {
        this.fromUid = fromUid;
    }

    public String getToUid() {
        return toUid;
    }

    public void setToUid(String toUid) {
        this.toUid = toUid;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Объявите HashMap или ArrayList глобально и напишите этот код map.clear() или arrayList.clear() в самом начале метода, из которого вы получаете свои данные. Надеюсь, проблема будет решена.

0 голосов
/ 15 марта 2020

Вы забыли очистить modelClassList.

  private void getMessage()
    {
        chatList = new ArrayList<>();
        final DatabaseReference chatRef = firebaseDatabase.getReference("Chats");
        chatRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                chatList.clear(); // Clear list
                for (DataSnapshot ds : dataSnapshot.getChildren())
                {
                    ChatModel chatModel = ds.getValue(ChatModel.class);
                    if (chatModel.getFromUid().equals(myUid) && chatModel.getToUid().equals(toUid) ||
                    chatModel.getFromUid().equals(toUid) && chatModel.getToUid().equals(myUid))
                    {
                        chatList.add(chatModel);
                    }
                    chatAdapter = new ChatAdapter(chatList,getApplicationContext());
                    chatAdapter.notifyDataSetChanged();
                    chatRecyclerView.setAdapter(chatAdapter);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

Это очистит список, а также решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...