android的评论及回复功能,Android实现朋友圈评论回复列表

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

正文

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

15108429061.gif?2017101591158

然后是主要实现代码:

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,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,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,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,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.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;

}

}

android:id="@+id/commentView"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="@dimen/dp_20" />

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

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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值