Я создаю приложение для чата. Я хочу, чтобы пользователи могли удалять чаты и сообщения из базы данных firebase. Ниже приведен код адаптера сообщений, который я пытался использовать для удаления сообщений, он отлично работает, когда я долго нажимаю на сообщение, но когда я снова вхожу в приложение, сообщения возвращаются. Я использую базу данных firebase
package com.paddi.paddi.paddi;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.firebase.auth.FirebaseAuth;
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.ValueEventListener;
import com.squareup.picasso.Picasso;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
/**
* Created by paddi on 15/11/2017.
*/
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>
{
private List<Messages> userMessagesList;
private FirebaseAuth mAuth;
private DatabaseReference UsersDatabaseReference;
public MessageAdapter(List<Messages> userMessagesList)
{
this.userMessagesList = userMessagesList;
}
// I tried using this to delete the chats it works but every time i log into the app again the messages re-appear
public void delete(int position){
userMessagesList.remove(position);
notifyItemRemoved(position);
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View V = LayoutInflater.from(parent.getContext())
.inflate(R.layout.messages_layout_of_users, parent, false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(V);
}
@Override
public void onBindViewHolder(final MessageViewHolder holder, int position)
{
String message_sender_id = mAuth.getCurrentUser().getUid();
Messages messages = userMessagesList.get(position);
String fromUserId = messages.getFrom();
String fromMessageType = messages.getType();
UsersDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(fromUserId);
UsersDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
String userName = dataSnapshot.child("user_name").getValue().toString();
String userImage = dataSnapshot.child("user_thumb_image").getValue().toString();
Picasso.with(holder.ReceiverProfileImage.getContext()).load(userImage)
.fit().centerInside().placeholder(R.drawable.default_profile).into(holder.ReceiverProfileImage);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if (fromMessageType.equals("text"))
{
holder.ReceiverMessageText.setVisibility(View.INVISIBLE);
holder.messagePicture.setVisibility(View.INVISIBLE);
holder.ReceiverProfileImage.setVisibility(View.INVISIBLE);
holder.SenderMessageText.setVisibility(View.INVISIBLE);
// You comment this last line out in case of any errors
if (fromUserId.equals(message_sender_id))
{
// You comment this first line out in case of any errors
holder.SenderMessageText.setVisibility(View.VISIBLE);
holder.SenderMessageText.setBackgroundResource(R.drawable.sender_message_text_background);
holder.SenderMessageText.setTextColor(Color.WHITE);
holder.SenderMessageText.setGravity(Gravity.START);
holder.SenderMessageText.setText(messages.getMessage());
}
else
{
holder.SenderMessageText.setVisibility(View.INVISIBLE);
holder.ReceiverMessageText.setVisibility(View.VISIBLE);
holder.ReceiverProfileImage.setVisibility(View.VISIBLE);
holder.messagePicture.setVisibility(View.VISIBLE);
holder.ReceiverMessageText.setBackgroundResource(R.drawable.receiver_message_text_background);
holder.ReceiverMessageText.setTextColor(Color.WHITE);
holder.ReceiverMessageText.setGravity(Gravity.START);
holder.ReceiverMessageText.setText(messages.getMessage());
}
// holder.messageText.setText(messages.getMessage());
}
else
{
// holder.messageText.setVisibility(View.INVISIBLE);
// holder.messageText.setPadding(0,0,0,0);
// holder.messagePicture.setForegroundGravity(22);
Picasso.with(holder.ReceiverProfileImage.getContext()).load(messages.getMessage())
.placeholder(R.drawable.default_profile).into(holder.messagePicture);
}
}
@Override
public int getItemCount()
{
return userMessagesList.size();
}
public class MessageViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener
{
public TextView SenderMessageText, ReceiverMessageText;
public CircleImageView ReceiverProfileImage;
public ImageView messagePicture;
public MessageViewHolder(View view) {
super(view);
SenderMessageText = (TextView) itemView.findViewById(R.id.sender_message_text);
ReceiverMessageText = (TextView) itemView.findViewById(R.id.receiver_message_text);
messagePicture = (ImageView) view.findViewById(R.id.message_image_view);
ReceiverProfileImage = (CircleImageView) view.findViewById(R.id.messages_profile_image);
SenderMessageText.setOnLongClickListener(this);
ReceiverMessageText.setOnLongClickListener(this);
messagePicture.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View v) {
delete(getAdapterPosition());
return true;
}
}
}




Кажется, это код, в котором вы удаляете сообщение:
public void delete(int position){
userMessagesList.remove(position);
notifyItemRemoved(position);
}
Это удаляет сообщение только от адаптера, но не из базы данных. Поэтому логично, что сообщение появляется снова, когда вы перезапускаете приложение.
Чтобы удалить сообщение навсегда, вам также необходимо удалить его из базы данных. Поскольку вы не рассказали, как вы загружаете данные, сложно назвать точный код. Но это будет что-то вроде:
FirebaseDatabase.getInstance().getReference("messages").child("key_of_message").removeValue();
Что бы вы хотели увидеть или узнать, чтобы помочь мне, я пробовал все, что мог, и мне действительно нужно, чтобы это работало. @ Франк ван Пуффелен
Кажется, что ни один из ваших кодов не вызывает базу данных для удаления значения, что является способом заставить эту работу работать. Если мое объяснение имеет смысл: попробуйте выяснить, какой элемент выбрал пользователь, и вызовите removeValue() в DatabaseReference по этому пути. Если это не имеет смысла, я надеюсь, что кто-то другой сможет объяснить это лучше, чем я или документы.
вы можете добавить какое-то поле, например
isDeleted, к объекту сообщения и установить его наtrueпри удалении сообщения и перед отображением сообщения проверьте, удалено оно или нет