删除评论功能实现文档 ===================================== 功能描述 -------- 在朋友圈列表(DiscoveryFragment)的评论列表中,用户可以长按自己的评论来删除该评论。 删除前会弹出确认对话框,确认后调用API删除评论,删除成功后自动刷新列表。 实现位置 -------- 1. API定义:uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java 2. 网络服务:uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java 3. 功能实现:app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java API接口信息 ----------- 接口地址:POST /api/post/commentDel 请求参数: - comment_id (string, 必选) - 评论ID 修改详情 -------- 一、API定义修改(Api.java) --------------------------- 添加删除评论的API常量: /** * 删除评论 /api/post/commentDel */ public static final String POST_COMMENT_DEL = "/api/post/commentDel"; 位置:在 POST_COMMENT_LIST 常量定义之后 二、网络服务修改(AppService.java) ---------------------------------- 添加删除评论的方法: /** * 删除评论 * @param hashMap 参数Map,包含comment_id * @param callback 回调 */ public void deleteComment(HashMap hashMap, SimpleCallback callback){ String url = APP_SERVER_ADDRESS + Api.POST_COMMENT_DEL; OKHttpHelper.post(url, hashMap,Constants.getOkhttpHeaderParams(), callback); } 位置:在 publishComment() 方法之后 三、功能实现修改(DiscoveryFragment.java) ---------------------------------------- 1. 评论列表项添加长按删除功能 修改位置:initRcyCommentView() 方法的 bindView() 中 在设置点击事件之前,添加判断是否是自己的评论: // 判断是否是自己的评论 String currentUserId = Constants.getUserId(); boolean isMyComment = !TextUtils.isEmpty(currentUserId) && !TextUtils.isEmpty(listBean.getUser_id()) && currentUserId.equals(listBean.getUser_id()); 在点击事件设置之后,添加长按删除功能: // 如果是自己的评论,添加长按删除功能 if (isMyComment) { holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // 显示删除确认对话框 showDeleteCommentDialog(listBean.getId(), postId); return true; } }); } 说明: - 通过比较当前用户ID和评论的user_id来判断是否是自己的评论 - 只有自己的评论才支持长按删除 - 长按后调用showDeleteCommentDialog()显示确认对话框 2. 删除确认对话框方法 /** * 显示删除评论确认对话框 * @param commentId 评论ID * @param postId 帖子ID */ private void showDeleteCommentDialog(String commentId, String postId) { CommDialog commDialog = CommDialog.newInstance(); commDialog.setCallBak(new DialogCallBack() { @Override public void initView(View viewRoot) { TextView diaTitle = viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_ada_title); TextView diaContent = viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_text); diaTitle.setText("确认删除"); diaContent.setText("确定要删除这条评论吗?"); diaContent.setVisibility(View.VISIBLE); viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_cancel).setOnClickListener(view1 -> commDialog.dismiss()); viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_ok).setOnClickListener(view1 -> { commDialog.dismiss(); deleteComment(commentId, postId, new SimpleCallback() { @Override public void onUiSuccess(Object o) { ToastUtils.showToast(getActivity(), "删除成功"); mPage = 1; getPublish(); } @Override public void onUiFailure(int code, String msg) { ToastUtils.showToast(getActivity(), msg != null ? msg : "删除失败"); } }); }); } }); commDialog.show(getActivity()); } 说明: - 使用CommDialog显示确认对话框 - 对话框标题:"确认删除" - 对话框内容:"确定要删除这条评论吗?" - 点击取消:关闭对话框 - 点击确认:调用deleteComment()删除评论,删除成功后刷新列表 3. 删除评论方法 /** * 删除评论 * @param commentId 评论ID * @param postId 帖子ID(用于刷新列表) * @param callback 回调 */ private void deleteComment(String commentId, String postId, SimpleCallback callback) { HashMap headParams = new HashMap<>(); headParams.put("comment_id", commentId); AppService.Instance().deleteComment(headParams, new SimpleCallback() { @Override public void onUiSuccess(Object o) { if (callback != null) { callback.onUiSuccess(o); } } @Override public void onUiFailure(int code, String msg) { if (callback != null) { callback.onUiFailure(code, msg); } } }); } 说明: - 构建请求参数,包含comment_id - 调用AppService.Instance().deleteComment()发送请求 - 通过回调处理成功和失败情况 技术要点 -------- 1. 权限控制 - 通过比较user_id判断是否是自己的评论 - 只有自己的评论才支持删除操作 - 使用Constants.getUserId()获取当前用户ID 2. 交互方式 - 使用长按(OnLongClickListener)触发删除操作 - 类似微信的交互方式,用户体验友好 - 长按返回true,阻止触发点击事件 3. 确认机制 - 删除前必须经过确认对话框 - 防止误操作删除评论 - 使用CommDialog统一风格的对话框 4. 数据刷新 - 删除成功后调用getPublish()刷新列表 - 重置页码为1,重新加载第一页数据 - 确保删除后列表显示最新状态 5. 错误处理 - 删除失败时显示错误提示 - 使用ToastUtils显示用户友好的提示信息 - 处理空消息情况,显示默认错误提示 功能特点 -------- 1. 权限控制 - 只能删除自己的评论 - 通过user_id判断评论归属 - 非自己的评论不显示删除选项 2. 交互体验 - 长按触发删除,符合用户习惯 - 删除前确认,防止误操作 - 删除成功后自动刷新,无需手动操作 3. 视觉反馈 - 删除成功显示"删除成功"提示 - 删除失败显示具体错误信息 - 使用统一的对话框样式 4. 数据同步 - 删除后立即刷新列表 - 确保UI显示与服务器数据一致 - 自动更新评论数量 使用场景 -------- - 用户在朋友圈列表中查看评论 - 发现自己的评论有误或不想保留 - 长按自己的评论项 - 弹出确认删除对话框 - 确认后删除评论 - 列表自动刷新,评论消失 数据流程 -------- 1. 用户长按评论项 ↓ 2. 判断是否是自己的评论(比较user_id) ↓ 3. 显示删除确认对话框 ↓ 4. 用户点击确认 ↓ 5. 调用deleteComment()方法 ↓ 6. 发送POST请求到/api/post/commentDel ↓ 7. 服务器处理删除请求 ↓ 8. 返回删除结果 ↓ 9. 删除成功:显示提示,刷新列表 删除失败:显示错误信息 注意事项 -------- 1. 权限判断 - 必须正确获取当前用户ID - 确保user_id字段不为空 - 字符串比较使用equals()方法 2. Fragment生命周期 - 在调用getActivity()前检查Fragment状态 - 确保对话框在Fragment活跃时显示 - 避免内存泄漏 3. 网络请求 - 删除操作需要网络请求 - 处理网络异常情况 - 提供友好的错误提示 4. 列表刷新 - 删除成功后必须刷新列表 - 重置页码确保数据正确 - 避免显示已删除的评论 5. 用户体验 - 长按操作要响应及时 - 确认对话框要清晰明确 - 删除后要有明确的反馈 测试建议 -------- 1. 功能测试 - 测试长按自己的评论:应显示删除对话框 - 测试长按他人的评论:不应显示删除选项 - 测试点击确认:应删除评论并刷新列表 - 测试点击取消:应关闭对话框,不删除评论 2. 边界测试 - 测试网络异常情况:应显示错误提示 - 测试删除已删除的评论:应处理服务器错误 - 测试空评论ID:应防止发送无效请求 3. 交互测试 - 测试长按响应速度:应快速响应 - 测试对话框显示:应正确显示标题和内容 - 测试列表刷新:删除后应正确更新 4. 权限测试 - 测试不同用户的评论:只能删除自己的 - 测试user_id为空:应正确处理 - 测试当前用户ID获取:应正确获取 相关文件 -------- - API定义:uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java - 网络服务:uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java - 功能实现:app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java - 数据模型:uikit/src/main/java/cn/wildfire/chat/kit/net/model/GetCommentInfoResult.java - 对话框:cn.wildfire.chat.kit.dialog.CommDialog 版本信息 -------- - 实现日期:2025年 - API接口:POST /api/post/commentDel - 请求参数:comment_id (string, 必选) - 修改文件: * uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java * uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java * app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java 代码示例 -------- 1. 判断是否是自己的评论: ```java String currentUserId = Constants.getUserId(); boolean isMyComment = !TextUtils.isEmpty(currentUserId) && !TextUtils.isEmpty(listBean.getUser_id()) && currentUserId.equals(listBean.getUser_id()); ``` 2. 长按删除监听: ```java if (isMyComment) { holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { showDeleteCommentDialog(listBean.getId(), postId); return true; } }); } ``` 3. 删除评论请求: ```java HashMap headParams = new HashMap<>(); headParams.put("comment_id", commentId); AppService.Instance().deleteComment(headParams, callback); ``` 4. 删除成功后刷新: ```java ToastUtils.showToast(getActivity(), "删除成功"); mPage = 1; getPublish(); ```