package com.idrv.coach.ui.adapter; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.idrv.coach.R; import com.idrv.coach.ZjbApplication; import com.idrv.coach.bean.TeamInvite; import com.idrv.coach.bean.Trend; import com.idrv.coach.bean.User; import com.idrv.coach.data.manager.LoginManager; import com.idrv.coach.ui.view.NoneView; import com.idrv.coach.ui.view.VerticalImageSpan; import com.idrv.coach.utils.TimeUtil; import com.idrv.coach.utils.ValidateUtil; import com.idrv.coach.utils.helper.ViewUtils; import com.zjb.loader.ZjbImageLoader; import com.zjb.loader.internal.core.assist.ImageScaleType; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; import static com.idrv.coach.ZjbApplication.gContext; /** * time:2016/3/24 * description: * * @author sunjianfei */ public class DynamicAdapter extends AbsRecycleAdapter<Trend, RecyclerView.ViewHolder> { private static final int TYPE_HEADER = 0X000; private static final int TYPE_ACCESS = 0X001; private static final int TYPE_JOIN = 0X002; private static final int TYPE_SHARE = 0X003; private static final int TYPE_ASK = 0X004; private static final int TYPE_DEFAULT = 0x005; //学员点赞 private static final int TREND_0 = 0; private static final int TREND_1 = 1; //教练入团 private static final int TREND_2 = 2; //教练分享资讯 private static final int TREND_3 = 3; //助驾帮访问 private static final int TREND_4 = 4; //学员转发 private static final int TREND_5 = 5; //学员访问 private static final int TREND_6 = 6; //评论 private static final int TREND_7 = 7; //咨询 private static final int TREND_8 = 8; //header最多显示9个头像 private static final int LIKE_COUNT = 9; private TeamInvite mTeamInvite; private int praiseSum; private List<String> praiserAvators; private LikeListener mListener; public void setTeamInvite(TeamInvite teamInvite) { this.mTeamInvite = teamInvite; } public void setPraiseSum(int praiseSum) { this.praiseSum = praiseSum; } public void setPraiserAvators(List<String> praiserAvators) { this.praiserAvators = praiserAvators; } public void setListener(LikeListener listener) { this.mListener = listener; } @Override public int getItemCount() { return ValidateUtil.isValidate(mData) ? mData.size() + 1 : 1; } @Override public int getItemViewType(int position) { if (position == 0) { return TYPE_HEADER; } else { Trend trend = mData.get(position - 1); int type = trend.getType(); switch (type) { case TREND_0: case TREND_3: case TREND_4: case TREND_5: case TREND_6: return TYPE_SHARE; case TREND_1: return TYPE_ACCESS; case TREND_2: return TYPE_JOIN; case TREND_7: case TREND_8: return TYPE_ASK; } } return TYPE_DEFAULT; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return createViewHolder(viewType, parent); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int type = getItemViewType(position); if (type == TYPE_HEADER) { showItem(holder, null, type, position); } else { Trend trend = mData.get(position - 1); showItem(holder, trend, type, position); } } private RecyclerView.ViewHolder createViewHolder(int type, ViewGroup parent) { View view; LayoutInflater inflater = LayoutInflater.from(parent.getContext()); RecyclerView.ViewHolder viewHolder = null; switch (type) { case TYPE_HEADER: view = inflater.inflate(R.layout.vw_dynamic_header, parent, false); viewHolder = new HeaderViewHolder(view); break; case TYPE_ACCESS: view = inflater.inflate(R.layout.vw_dynamic_item_type_access, parent, false); viewHolder = new ItemTypeAccessViewHolder(view); break; case TYPE_JOIN: view = inflater.inflate(R.layout.vw_dynamic_item_type_join, parent, false); viewHolder = new ItemTypeJoinViewHolder(view); break; case TYPE_SHARE: view = inflater.inflate(R.layout.vw_dynamic_item_type_share, parent, false); viewHolder = new ItemTypeShareViewHolder(view); break; case TYPE_ASK: view = inflater.inflate(R.layout.vw_dynamic_item_type_ask, parent, false); viewHolder = new ItemAskViewHolder(view); break; case TYPE_DEFAULT: view = new NoneView(parent.getContext()); viewHolder = new ItemDefaultViewHolder(view); break; } return viewHolder; } private void showItem(RecyclerView.ViewHolder holder, Trend trend, int type, int pos) { Context context = holder.itemView.getContext(); switch (type) { case TYPE_HEADER: { //1.header部分 HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; User user = LoginManager.getInstance().getLoginUser(); ViewUtils.showRingAvatar(headerViewHolder.mAvatar, user.getHeadimgurl()); headerViewHolder.mNickNameTv.setText(user.getNickname()); headerViewHolder.mLikeTv.setText(praiseSum + ""); if (null == mTeamInvite) { headerViewHolder.mBubbleIv.setVisibility(View.GONE); } else { headerViewHolder.mBubbleIv.setVisibility(View.VISIBLE); headerViewHolder.mBubbleIv.setOnClickListener(v -> { if (null != mListener) { mListener.onShowInvite(mTeamInvite); } }); } } break; case TYPE_ACCESS: { ItemTypeAccessViewHolder viewHolder = (ItemTypeAccessViewHolder) holder; String time = TimeUtil.getFeedsTime(TimeUtil.getTempTime(trend.getTime())); User user = LoginManager.getInstance().getLoginUser(); viewHolder.mNickNameTv.setText(user.getNickname()); viewHolder.mInfluenceTv.setText(R.string.access_tips); viewHolder.mTimeTv.setText(time); List<String> avatars = trend.getAvators(); if (ValidateUtil.isValidate(avatars)) { //只显示最多5个头像 if (avatars.size() > 5) { avatars = avatars.subList(0, 5); } updateLikeLayout(avatars, viewHolder.mAccessLayout, false); } //1.显示头像 ZjbImageLoader.create(user.getHeadimgurl()) .setDefaultRes(R.drawable.icon_user_avatar_default_92) .setQiniu(100, 100) .setImageScaleType(ImageScaleType.EXACTLY) .setDisplayType(ZjbImageLoader.DISPLAY_ROUND) .into(viewHolder.mAvatar); } break; case TYPE_JOIN: { ItemTypeJoinViewHolder viewHolder = (ItemTypeJoinViewHolder) holder; String teamName = context.getString(R.string.join_team, trend.getTeamName()); String time = TimeUtil.getFeedsTime(TimeUtil.getTempTime(trend.getTime())); //1.显示头像 ZjbImageLoader.create(trend.getCoachHeadimgurl()) .setDefaultRes(R.drawable.icon_user_avatar_default_92) .setQiniu(100, 100) .setImageScaleType(ImageScaleType.EXACTLY) .setDisplayType(ZjbImageLoader.DISPLAY_ROUND) .into(viewHolder.mAvatar); viewHolder.mNickNameTv.setText(context.getString(R.string.coach, trend.getCoachNickName())); viewHolder.mSubjectTv.setText(teamName); viewHolder.mTimeTv.setText(time); if (!ValidateUtil.isValidate(trend.getNickNames())) { viewHolder.mLikeLayout.setVisibility(View.GONE); } else { viewHolder.mLikeLayout.setVisibility(View.VISIBLE); viewHolder.mLikeTv.setText(getImageSpan(trend)); } if (trend.isPraised()) { viewHolder.mLikeBtn.setImageResource(R.drawable.icon_good_on); viewHolder.mLikeBtn.setOnClickListener(null); } else { viewHolder.mLikeBtn.setImageResource(R.drawable.icon_good_off); viewHolder.mLikeBtn.setOnClickListener(v -> { ViewUtils.setDelayedClickable(v, 500); trend.setIsPraised(true); trend.addPraiseSum(); User user = LoginManager.getInstance().getLoginUser(); trend.addLikeName(user.getNickname()); String coachId = trend.getCoachId(); //如果是我自己的消息 if (user.getUid().equals(coachId)) { //如果列表里没有我的头像,则添加 if (!praiserAvators.contains(user.getHeadimgurl())) { praiserAvators.add(user.getHeadimgurl()); } praiseSum += 1; } //刷新header notifyItemChanged(0); notifyItemChanged(pos); if (null != mListener) { mListener.onLike(trend.getTargetId(), trend.getCoachId(), trend.getType()); } }); } } break; case TYPE_SHARE: { //1.如果是:教练动态 ItemTypeShareViewHolder viewHolder = (ItemTypeShareViewHolder) holder; String time = TimeUtil.getFeedsTime(TimeUtil.getTempTime(trend.getTime())); String avatarUrl; if (trend.getType() == TREND_3) { avatarUrl = trend.getCoachHeadimgurl(); viewHolder.mMyTeamIcon.setVisibility(View.VISIBLE); viewHolder.mOpIv.setVisibility(View.GONE); viewHolder.mNickNameTv.setText(context.getString(R.string.coach, trend.getCoachNickName())); viewHolder.mInfluenceTv.setText(context.getString(R.string.day_influence, trend.getImpact())); viewHolder.mTimeTv.setText(time); viewHolder.mLikeBtn.setVisibility(View.VISIBLE); viewHolder.mLikeLayout.setVisibility(View.VISIBLE); viewHolder.mHline.setVisibility(View.VISIBLE); if (ValidateUtil.isValidate(trend.getNickNames())) { viewHolder.mLikeLayout.setVisibility(View.VISIBLE); viewHolder.mLikeTv.setText(getImageSpan(trend)); } else { viewHolder.mLikeLayout.setVisibility(View.GONE); } if (trend.isPraised()) { viewHolder.mLikeBtn.setImageResource(R.drawable.icon_good_on); viewHolder.mLikeBtn.setOnClickListener(null); } else { viewHolder.mLikeBtn.setImageResource(R.drawable.icon_good_off); viewHolder.mLikeBtn.setOnClickListener(v -> { ViewUtils.setDelayedClickable(v, 500); trend.setIsPraised(true); trend.addPraiseSum(); User user = LoginManager.getInstance().getLoginUser(); trend.addLikeName(user.getNickname()); String coachId = trend.getCoachId(); //如果是我自己的消息 if (user.getUid().equals(coachId)) { //如果列表里没有我的头像,则添加 if (!praiserAvators.contains(user.getHeadimgurl())) { praiserAvators.add(user.getHeadimgurl()); } praiseSum += 1; } //刷新header notifyItemChanged(0); notifyItemChanged(pos); if (null != mListener) { mListener.onLike(trend.getTargetId(), trend.getCoachId(), trend.getType()); } }); } } else { String subject = null; //1.头像 avatarUrl = trend.getStudentHeadimgurl(); //2.昵称 String nickname = trend.getStudentNickName(); int mType = trend.getType(); if (mType == TREND_4) { subject = trend.isHasQrCode() ? context.getString(R.string.type_forwarding) : context.getString(R.string.upload_qr_code); viewHolder.mOpIv.setVisibility(View.VISIBLE); viewHolder.mOpIv.setImageResource(R.drawable.re_share); } else { String studentNickName = trend.getStudentNickName(); if (!TextUtils.isEmpty(studentNickName)) { if (studentNickName.length() > 6) { studentNickName = studentNickName.substring(0, 6); } } else { studentNickName = context.getString(R.string.default_student_name); } if (mType == TREND_0) { //需要判断点赞的主体是我本人还是团队内的其他教练 if (LoginManager.getInstance().getUid().equals(trend.getCoachId())) { viewHolder.mOpIv.setVisibility(View.VISIBLE); viewHolder.mOpIv.setImageResource(R.drawable.lighting); viewHolder.mMyTeamIcon.setVisibility(View.GONE); subject = context.getString(R.string.type_like); } else if (!TextUtils.isEmpty(trend.getCoachNickName())) { viewHolder.mMyTeamIcon.setVisibility(View.VISIBLE); viewHolder.mOpIv.setVisibility(View.GONE); nickname = trend.getCoachNickName(); avatarUrl = trend.getCoachHeadimgurl(); subject = String.format(context.getString(R.string.type_share_like), studentNickName); } } else if (mType == TREND_5) { //需要判断分享的主体是我本人还是团队内的其他教练 if (LoginManager.getInstance().getUid().equals(trend.getCoachId())) { viewHolder.mOpIv.setVisibility(View.VISIBLE); viewHolder.mOpIv.setImageResource(R.drawable.re_share); viewHolder.mMyTeamIcon.setVisibility(View.GONE); subject = context.getString(R.string.type_forwarding); } else if (!TextUtils.isEmpty(trend.getCoachNickName())) { viewHolder.mMyTeamIcon.setVisibility(View.VISIBLE); viewHolder.mOpIv.setVisibility(View.GONE); nickname = trend.getCoachNickName(); avatarUrl = trend.getCoachHeadimgurl(); subject = String.format(context.getString(R.string.type_share_forwarding), studentNickName); } } else if (mType == TREND_6) { viewHolder.mMyTeamIcon.setVisibility(View.GONE); viewHolder.mOpIv.setVisibility(View.VISIBLE); viewHolder.mOpIv.setImageResource(R.drawable.icon_access); nickname = trend.getStudentNickName(); avatarUrl = trend.getStudentHeadimgurl(); subject = context.getString(R.string.someone_read_my_shared_news); } } if (TextUtils.isEmpty(nickname)) { nickname = context.getResources().getString(R.string.student); } viewHolder.mNickNameTv.setText(nickname); viewHolder.mInfluenceTv.setText(subject); viewHolder.mTimeTv.setText(time); viewHolder.mLikeBtn.setVisibility(View.GONE); viewHolder.mLikeLayout.setVisibility(View.GONE); viewHolder.mHline.setVisibility(View.GONE); } viewHolder.mWebLayout.setVisibility(View.VISIBLE); viewHolder.mWebNameTv.setText(trend.getTaskName()); ZjbImageLoader.create(avatarUrl) .setDefaultRes(R.drawable.icon_user_avatar_default_92) .setQiniu(100, 100) .setImageScaleType(ImageScaleType.EXACTLY) .setDisplayType(ZjbImageLoader.DISPLAY_ROUND) .into(viewHolder.mAvatar); } break; case TYPE_ASK: { ItemAskViewHolder viewHolder = (ItemAskViewHolder) holder; int mType = trend.getType(); String nickName = trend.getStudentNickName(); String avatarUrl = trend.getStudentHeadimgurl(); String time = TimeUtil.getFeedsTime(TimeUtil.getTempTime(trend.getTime())); boolean isComment = mType == TREND_7; String subText = isComment ? context.getString(R.string.comment_me_at_my_website) : context.getString(R.string.ask_me_at_my_website); viewHolder.mNickNameTv.setText(nickName); viewHolder.mSubTv.setText(subText); viewHolder.mTimeTv.setText(time); viewHolder.mContentTv.setText(trend.getContent()); ZjbImageLoader.create(avatarUrl) .setDefaultRes(R.drawable.icon_user_avatar_default_92) .setQiniu(100, 100) .setImageScaleType(ImageScaleType.EXACTLY) .setDisplayType(ZjbImageLoader.DISPLAY_ROUND) .into(viewHolder.mAvatar); if (!isComment) { viewHolder.mSubImageView.setImageResource(R.drawable.ask_me); viewHolder.mRightOpBtn.setVisibility(View.VISIBLE); viewHolder.mRightOpBtn.setOnClickListener(v -> { String phoneNumber = trend.getStudentPhone(); if (!TextUtils.isEmpty(phoneNumber)) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(intent); } } }); } else { viewHolder.mSubImageView.setImageResource(R.drawable.commented); viewHolder.mRightOpBtn.setVisibility(View.GONE); } } break; } } class HeaderViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.avatar) ImageView mAvatar; @InjectView(R.id.name_tv) TextView mNickNameTv; @InjectView(R.id.like_count_tv) TextView mLikeTv; @InjectView(R.id.invite_bubble) View mBubbleIv; public HeaderViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } class ItemTypeJoinViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.avatar) ImageView mAvatar; @InjectView(R.id.nick_name) TextView mNickNameTv; @InjectView(R.id.subject_tv) TextView mSubjectTv; @InjectView(R.id.time) TextView mTimeTv; @InjectView(R.id.like_btn) ImageView mLikeBtn; @InjectView(R.id.like_tv) TextView mLikeTv; @InjectView(R.id.like_layout) View mLikeLayout; public ItemTypeJoinViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } class ItemTypeAccessViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.avatar) ImageView mAvatar; @InjectView(R.id.nick_name) TextView mNickNameTv; @InjectView(R.id.influence_tv) TextView mInfluenceTv; @InjectView(R.id.time) TextView mTimeTv; @InjectView(R.id.access_layout) LinearLayout mAccessLayout; public ItemTypeAccessViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } class ItemTypeShareViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.my_team_iv) ImageView mMyTeamIcon; @InjectView(R.id.avatar) ImageView mAvatar; @InjectView(R.id.nick_name) TextView mNickNameTv; @InjectView(R.id.influence_tv) TextView mInfluenceTv; @InjectView(R.id.time) TextView mTimeTv; @InjectView(R.id.like_btn) ImageView mLikeBtn; @InjectView(R.id.like_tv) TextView mLikeTv; @InjectView(R.id.like_layout) View mLikeLayout; @InjectView(R.id.web_layout) View mWebLayout; @InjectView(R.id.web_name) TextView mWebNameTv; @InjectView(R.id.h_line) View mHline; @InjectView(R.id.op_icon) ImageView mOpIv; public ItemTypeShareViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } class ItemAskViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.avatar) ImageView mAvatar; @InjectView(R.id.nick_name) TextView mNickNameTv; @InjectView(R.id.right_op_btn) ImageView mRightOpBtn; @InjectView(R.id.sub_text_view) TextView mSubTv; @InjectView(R.id.content_tv) TextView mContentTv; @InjectView(R.id.time) TextView mTimeTv; @InjectView(R.id.sub_image) ImageView mSubImageView; public ItemAskViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } class ItemDefaultViewHolder extends RecyclerView.ViewHolder { public ItemDefaultViewHolder(View itemView) { super(itemView); } } private void updateLikeLayout(List<String> avatars, LinearLayout mLikeLayout, boolean needPadding) { if (ValidateUtil.isValidate(avatars)) { int count = 0; int sWidth = gContext.getResources().getDisplayMetrics().widthPixels; int firstElementMarginLeft = Math.round(gContext.getResources() .getDimension(R.dimen.like_author_margin)); int contentWidth = sWidth - 2 * firstElementMarginLeft; int imageWidth = Math.round(contentWidth / (((LIKE_COUNT) - 1) * 0.4167f + LIKE_COUNT)); int marginLeft = Math.round(imageWidth * 0.4167f); mLikeLayout.setVisibility(View.VISIBLE); mLikeLayout.setOrientation(LinearLayout.HORIZONTAL); mLikeLayout.removeAllViews(); for (int i = 0; i < avatars.size(); i++) { String avatar = avatars.get(i); if (TextUtils.isEmpty(avatar)) { continue; } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imageWidth, imageWidth); if (needPadding) { params.leftMargin = count > 0 ? marginLeft : firstElementMarginLeft; } else { if (i != 0) { params.leftMargin = count > 0 ? marginLeft : firstElementMarginLeft; } } if (count >= LIKE_COUNT - 1) { int num = avatars.size(); View view = getMoreImageView(num + ""); mLikeLayout.addView(view, params); view.setOnClickListener(v -> { ViewUtils.setDelayedClickable(v, 800); }); break; } else { ImageView likeImageView = getLikeImageView(avatar); mLikeLayout.addView(likeImageView, params); likeImageView.setOnClickListener(v -> { ViewUtils.setDelayedClickable(v, 800); }); } count++; } } } public View getMoreImageView(String num) { View view = LayoutInflater.from(gContext).inflate(R.layout.vw_dynamic_header_arrow_right, null, false); TextView textView = (TextView) view.findViewById(R.id.text); int number = Integer.parseInt(num); number = number > 99 ? 99 : number; textView.setText(number + ""); return view; } public ImageView getLikeImageView(String url) { ImageView imageView = new ImageView(gContext); ZjbImageLoader.create(url) .setDefaultRes(R.drawable.icon_user_avatar_default_92) .setQiniu(100, 100) .setImageScaleType(ImageScaleType.EXACTLY) .setDisplayType(ZjbImageLoader.DISPLAY_ROUND) .into(imageView); return imageView; } public interface LikeListener { void onLike(String targetId, String coachId, int type); void onShowInvite(TeamInvite invite); } private SpannableString getImageSpan(Trend trend) { Bitmap b = BitmapFactory.decodeResource(gContext.getResources(), R.drawable.icon_good_for_name); VerticalImageSpan imgSpan = new VerticalImageSpan(gContext, b); String strSpan = trend.getNameStr(); int praiseSum = trend.getPraiseSum(); if (praiseSum > 6) { strSpan = strSpan + ZjbApplication.gContext.getString(R.string.praise_sum, praiseSum); } SpannableString spanString = new SpannableString("icon" + strSpan); spanString.setSpan(imgSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return spanString; } }