热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现朋友圈评论回复列表

本文实例为大家分享了Android实现朋友圈评论回复列表的具体代码,供大家参考,具体内容如下 Android实现朋友圈评论回复列表 An

本文实例为大家分享了Android实现朋友圈评论回复列表的具体代码,供大家参考,具体内容如下

Android实现朋友圈评论回复列表

Android实现朋友圈点赞列表

Android实现朋友圈多图显示功能

正文

还是老流程,先来看一下效果图:

然后是主要实现代码:

CommentsView

public class CommentsView extends LinearLayout {

 private Context mContext;
 private List mDatas;
 private onItemClickListener listener;

 public CommentsView(Context context) {
  this(context, null);
 }

 public CommentsView(Context context, @Nullable AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public CommentsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  setOrientation(VERTICAL);
  this.mCOntext= context;
 }

 /**
  * 设置评论列表信息
  *
  * @param list
  */
 public void setList(List list) {
  mDatas = list;
 }

 public void setOnItemClickListener(onItemClickListener listener) {
  this.listener = listener;
 }

 public void notifyDataSetChanged() {
  removeAllViews();
  if (mDatas == null || mDatas.size() <= 0) {
   return;
  }
  LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
  layoutParams.setMargins(0, 10, 0, 10);
  for (int i = 0; i 

CircleMovementMethod

public class CircleMovementMethod extends BaseMovementMethod {
 private final static int DEFAULT_COLOR_ID = android.R.color.transparent;
 /**
  * 整个textView的背景色
  */
 private int textViewBgColor;
 /**
  * 点击部分文字时部分文字的背景色
  */
 private int clickableSpanBgClor;

 private BackgroundColorSpan mBgSpan;
 private ClickableSpan[] mClickLinks;


 /**
  * @param clickableSpanBgClor 点击选中部分时的背景色
  */
 public CircleMovementMethod(int clickableSpanBgClor) {
  this.clickableSpanBgClor = clickableSpanBgClor;
 }

 /**
  * @param clickableSpanBgClor 点击选中部分时的背景色
  * @param textViewBgColor  整个textView点击时的背景色
  */
 public CircleMovementMethod(int clickableSpanBgClor, int textViewBgColor) {
  this.textViewBgColor = textViewBgColor;
  this.clickableSpanBgClor = clickableSpanBgClor;
 }

 public boolean onTouchEvent(TextView widget, Spannable buffer,
        MotionEvent event) {

  int action = event.getAction();
  if (action == MotionEvent.ACTION_DOWN) {
   int x = (int) event.getX();
   int y = (int) event.getY();

   x -= widget.getTotalPaddingLeft();
   y -= widget.getTotalPaddingTop();

   x += widget.getScrollX();
   y += widget.getScrollY();

   Layout layout = widget.getLayout();
   int line = layout.getLineForVertical(y);
   int off = layout.getOffsetForHorizontal(line, x);

   mClickLinks = buffer.getSpans(off, off, ClickableSpan.class);
   if (mClickLinks.length > 0) {
    // 点击的是Span区域,不要把点击事件传递
    Selection.setSelection(buffer,
      buffer.getSpanStart(mClickLinks[0]),
      buffer.getSpanEnd(mClickLinks[0]));
    //设置点击区域的背景色
    mBgSpan = new BackgroundColorSpan(clickableSpanBgClor);
    buffer.setSpan(mBgSpan,
      buffer.getSpanStart(mClickLinks[0]),
      buffer.getSpanEnd(mClickLinks[0]),
      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
   } else {
    // textview选中效果
//    widget.setBackgroundColor(textViewBgColor);
    widget.setBackgroundResource(DEFAULT_COLOR_ID);
   }

  } else if (action == MotionEvent.ACTION_UP) {
   if (mClickLinks.length > 0) {
    mClickLinks[0].onClick(widget);
    if (mBgSpan != null) {//移除点击时设置的背景span
     buffer.removeSpan(mBgSpan);
    }
   } else {

   }
   Selection.removeSelection(buffer);
   widget.setBackgroundResource(DEFAULT_COLOR_ID);
  } else if (action == MotionEvent.ACTION_MOVE) {
   //这种情况不用做处理
  } else {
   if (mBgSpan != null) {//移除点击时设置的背景span
    buffer.removeSpan(mBgSpan);
   }
   widget.setBackgroundResource(DEFAULT_COLOR_ID);
  }
  return Touch.onTouchEvent(widget, buffer, event);
 }
}

相关数据结构(模拟)

CommentsBean

public class CommentsBean implements Serializable {
 private int commentsId;
 private String content;
 private UserBean replyUser; // 回复人信息
 private UserBean commentsUser; // 评论人信息

 public int getCommentsId() {
  return commentsId;
 }

 public void setCommentsId(int commentsId) {
  this.commentsId = commentsId;
 }

 public String getContent() {
  return content;
 }

 public void setContent(String content) {
  this.cOntent= content;
 }

 public UserBean getReplyUser() {
  return replyUser;
 }

 public void setReplyUser(UserBean replyUser) {
  this.replyUser = replyUser;
 }

 public UserBean getCommentsUser() {
  return commentsUser;
 }

 public void setCommentsUser(UserBean commentsUser) {
  this.commentsUser = commentsUser;
 }
}

UserBean

public class UserBean implements Serializable {
 private int userId;
 private String userName;

 public int getUserId() {
  return userId;
 }

 public void setUserId(int userId) {
  this.userId = userId;
 }

 public String getUserName() {
  return userName;
 }

 public void setUserName(String userName) {
  this.userName = userName;
 }
}

用法



commentView = LvV.find(this, R.id.commentView);
commentView.setList(Data.getComments());
commentView.setOnItemClickListener(new CommentsView.onItemClickListener() {
 @Override
 public void onItemClick(int position, CommentsBean bean) {

 }
});
commentView.notifyDataSetChanged();

代码已整理到Github

附:如果需要完整朋友圈项目的话,这里推荐一个 Github 项目仿微信实现的朋友圈

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 本文介绍了在使用 `git push origin --delete ` 命令删除远程分支后,本地 `git branch -a` 仍显示已删除分支的问题,并提供了详细的解决方案。 ... [详细]
author-avatar
88943w
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有