Reputation: 25
I am making a chat app I want the users to be able to delete chats and messages from firebase database Below is the code for the message adapter I tried using some code to delete the messages, it works fine when I long click on the message but when I log back into the app the messages come back. I use firebase database
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;
}
}
}
This is a screenshot of my database for the messages tree:
Upvotes: 1
Views: 4890
Reputation: 599581
This seems to be the code where you delete the message:
public void delete(int position){
userMessagesList.remove(position);
notifyItemRemoved(position);
}
This only removes the message from the adapter, not from the database. So it makes sense that the message reappears when you restart the app.
To delete the message permanently you'll also have to remove it from the database. Since you didn't share how you load the data, it's hard to give the exact code. But it'll be something like:
FirebaseDatabase.getInstance().getReference("messages").child("key_of_message").removeValue();
Upvotes: 1