本文实例为大家分享了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 < mDatas.size(); i++) {   View view = getView(i);   if (view == null) {    throw new NullPointerException("listview item layout is null, please check getView()...");   }   addView(view, i, layoutParams);  } } private View getView(final int position) {  final CommentsBean item = mDatas.get(position);  UserBean replyUser = item.getReplyUser();  boolean hasReply = false; // 是否有回复  if (replyUser != null) {   hasReply = true;  }  TextView textView = new TextView(mContext);  textView.setTextSize(15);  textView.setTextColor(0xff686868);  SpannableStringBuilder builder = new SpannableStringBuilder();  UserBean comUser = item.getCommentsUser();  String name = comUser.getUserName();  if (hasReply) {   builder.append(setClickableSpan(name, item.getCommentsUser()));   builder.append(" 回复 ");   builder.append(setClickableSpan(replyUser.getUserName(), item.getReplyUser()));  } else {   builder.append(setClickableSpan(name, item.getCommentsUser()));  }  builder.append(" : ");  builder.append(setClickableSpanContent(item.getContent(), position));  textView.setText(builder);  // 设置点击背景色  textView.setHighlightColor(getResources().getColor(android.R.color.transparent));//  textView.setHighlightColor(0xff000000);  textView.setMovementMethod(new CircleMovementMethod(0xffcccccc, 0xffcccccc));  textView.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    if (listener != null) {     listener.onItemClick(position, item);    }   }  });  return textView; } /**  * 设置评论内容点击事件  *  * @param item  * @param position  * @return  */ public SpannableString setClickableSpanContent(final String item, final int position) {  final SpannableString string = new SpannableString(item);  ClickableSpan span = new ClickableSpan() {   @Override   public void onClick(View widget) {    // TODO: 2017/9/3 评论内容点击事件    Toast.makeText(mContext, "position: " + position + " , content: " + item, Toast.LENGTH_SHORT).show();   }   @Override   public void updateDrawState(TextPaint ds) {    super.updateDrawState(ds);    // 设置显示的内容文本颜色    ds.setColor(0xff686868);    ds.setUnderlineText(false);   }  };  string.setSpan(span, 0, string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  return string; } /**  * 设置评论用户名字点击事件  *  * @param item  * @param bean  * @return  */ public SpannableString setClickableSpan(final String item, final UserBean bean) {  final SpannableString string = new SpannableString(item);  ClickableSpan span = new ClickableSpan() {   @Override   public void onClick(View widget) {    // TODO: 2017/9/3 评论用户名字点击事件    Toast.makeText(mContext, bean.getUserName(), Toast.LENGTH_SHORT).show();   }   @Override   public void updateDrawState(TextPaint ds) {    super.updateDrawState(ds);    // 设置显示的用户名文本颜色    ds.setColor(0xff387dcc);    ds.setUnderlineText(false);   }  };  string.setSpan(span, 0, string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  return string; } /**  * 定义一个用于回调的接口  */ public interface onItemClickListener {  void onItemClick(int position, CommentsBean bean); }}

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 项目仿微信实现的朋友圈

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

更多相关文章

  1. android 环境搭建helloworld
  2. Android(安卓)图片加载图片_OOM异常解决
  3. android EditText输入限制
  4. 高级组件之进度条
  5. EditText 的属性
  6. 【Android】给Android(安卓)Studio设置代理
  7. Android(安卓)Studio系列(二)使用Android(安卓)Studio开发/调试整
  8. android 设置布局动画
  9. Android横竖屏切换小结

随机推荐

  1. Android(安卓)MapView 申请apiKey
  2. Android的消息机制
  3. Android(安卓)Studio 2.0 Instant Run问
  4. Gradle依赖总结
  5. Android(安卓)View 的工作原理浅析
  6. View机制深入学习(一)
  7. 【Gradle】自定义Android(安卓)Gradle工
  8. Android中通过资源文件获取drawable的几
  9. android 如何查找内存泄漏
  10. Application Fundamentals-Components