java - 删除聊天 Activity 中的消息没有任何反应

标签 java android

我正在尝试制作 Android 应用程序用于聊天,当我发送消息完成时看到它已完成,但是当我尝试删除它时什么也没有发生...这是我的适配器聊天...出现对话框消息,但是当我单击时删除什么也没有发生...当我点击没有关闭对话框时,这很好...但是删除什么也没有...任何人都可以帮助我吗?

public class AdapterChat extends RecyclerView.Adapter<AdapterChat.MyHolder> {
private static final int MSG_TYPE_LEFT = 0;
private static final int MSG_TYPE_RIGHT = 1;
Context context;
List<Modelchat> chatList;
String imageUrl;

FirebaseUser fUser;

public AdapterChat(Context context, List<Modelchat> chatList, String imageUrl) {
    this.context = context;
    this.chatList = chatList;
    this.imageUrl = imageUrl;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    if (i == MSG_TYPE_RIGHT) {
        View view = LayoutInflater.from(context).inflate(R.layout.row_chat_right, viewGroup, false);
        return new MyHolder(view);
    } else {
        View view = LayoutInflater.from(context).inflate(R.layout.row_chat_left, viewGroup, false);
        return new MyHolder(view);
    }
}

@Override
public void onBindViewHolder(@NonNull MyHolder myHolder, final int i) {
    String message = chatList.get(i).getMessage();
    String timeStamp = chatList.get(i).getTimestamp();

    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(Long.parseLong(timeStamp));
    String dataTime = DateFormat.format("dd/MM/yyyy hh:mm aa", cal).toString();

    myHolder.messageTv.setText(message);
    myHolder.timeTv.setText(dataTime);
    try {
        Picasso.get().load(imageUrl).into(myHolder.profileTv);
    } catch (Exception e) {
    }
    //show delete dialog message

    myHolder.messageLAyout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Delete");
            builder.setMessage("Are you sure to delete this message?");
            builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    deleteMessage(i);
                }
            });
            builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            builder.create().show();
        }
    });

    if (i == chatList.size() - 1) {
        if (chatList.get(i).isSeen()) {
            myHolder.isSeenTv.setText("Seen");
        } else {
            myHolder.isSeenTv.setText("Delivered");
        }
    } else {
        myHolder.isSeenTv.setVisibility(View.GONE);

    }
}

private void deleteMessage(int position) {

    String myUID = FirebaseAuth.getInstance().getCurrentUser().getUid();

    String msgTimeStamp = chatList.get(position).getTimestamp();
    DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Chats");
    Query query = dbRef.orderByChild("timestamp").equalTo(msgTimeStamp);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                if (ds.child("sender").getValue().equals(myUID)) {
//                        ds.getRef().removeValue();
                    HashMap<String, Object> hashMap = new HashMap<>();
                    hashMap.put("message", "This message was deleted...");
                    ds.getRef().updateChildren(hashMap);
                    chatList.remove(i);
                    notifyItemRemoved(i);
                    notifyItemRangeChanged(i, chatList.size());
                    Toast.makeText(context, "message deleted...", Toast.LENGTH_SHORT).show();
                } else {
            Toast.makeText(context, "You can delete only your messages...", Toast.LENGTH_SHORT).show();

                }

            }
        }

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

        }
    });
}

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

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

class MyHolder extends RecyclerView.ViewHolder {

    ImageView profileTv;
    TextView messageTv, timeTv, isSeenTv;
    LinearLayout messageLAyout;


    public MyHolder(@NonNull View itemView) {
        super(itemView);

        profileTv = itemView.findViewById(R.id.profileTv);
        messageTv = itemView.findViewById(R.id.messageTv);
        timeTv = itemView.findViewById(R.id.timeTv);
        isSeenTv = itemView.findViewById(R.id.isSeenTv);
        messageLAyout = itemView.findViewById(R.id.messageLayout);

    }
}
}

Emulator

最佳答案

我认为删除是指将消息文本更改为“此消息已删除...”,如果是这种情况,那么问题在于您更新数据库并且不更新列表中的对象:

deleteMessage(intposition)函数中执行此操作:

....
....

if (ds.child("sender").getValue().equals(myUID)) {

//ds.getRef().removeValue();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted...");
ds.getRef().updateChildren(hashMap);
Toast.makeText(context, "message deleted...", Toast.LENGTH_SHORT).show();

//here add these lines to update the list value.........
chatList.get(position).setMessage("This message was deleted...");
notifyDataSetChanged();

......
......

关于java - 删除聊天 Activity 中的消息没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61705249/

相关文章:

java - 从未收到 SSH 服务器标识 - 握手死锁 [SSHJ]

java - 黑莓编程——定时器类

android - 使用 greenDao 动态查询

javascript - 在 Angular/ ionic 应用程序中捕获任意位置的点击/按下按钮/输入焦点

java - Gradle distributionUrl 随 'ionic cordova run android' 更改为旧版本,构建失败

java - FTP:创建文件夹 (Android)

java - 序列化和写入对象

java - 无法从 jms activemq 队列中删除消息

android - Android App 和 Android Library 之间的 GCM 冲突

android - SMS_DELIVERED Intent 的 SMS 发送报告不起作用