491 lines
20 KiB
Java
491 lines
20 KiB
Java
package com.yunbao.live.adapter;
|
|
|
|
import static com.yunbao.live.bean.LiveChatBean.RECOMMEND_CARD_NOTIFY;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.content.Context;
|
|
import android.os.Bundle;
|
|
import android.text.Spannable;
|
|
import android.text.SpannableStringBuilder;
|
|
import android.text.TextUtils;
|
|
import android.text.style.ForegroundColorSpan;
|
|
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 androidx.annotation.NonNull;
|
|
import androidx.recyclerview.widget.GridLayoutManager;
|
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import com.makeramen.roundedimageview.RoundedImageView;
|
|
import com.yunbao.common.CommonAppConfig;
|
|
import com.yunbao.common.Constants;
|
|
import com.yunbao.common.glide.ImgLoader;
|
|
import com.yunbao.common.interfaces.OnItemClickListener;
|
|
import com.yunbao.common.utils.Bus;
|
|
import com.yunbao.common.utils.DpUtil;
|
|
import com.yunbao.live.R;
|
|
import com.yunbao.live.activity.LiveAudienceActivity;
|
|
import com.yunbao.live.bean.LiveChatBean;
|
|
import com.yunbao.live.dialog.LiveHDDialogFragment;
|
|
import com.yunbao.live.event.LiveAudienceEvent;
|
|
import com.yunbao.live.utils.LiveTextRender;
|
|
import com.yunbao.live.utils.LoadDian9TuUtil;
|
|
import com.yunbao.live.views.LiveRoomViewHolder;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Created by cxf on 2018/10/10.
|
|
*/
|
|
|
|
public class LiveChatAdapter extends RecyclerView.Adapter {
|
|
public final static int MSG_HOUR_RANK_CHANGE = -100;//收到小时榜推送,发送一条弹幕
|
|
|
|
private Context mContext;
|
|
private List<LiveChatBean> mList;
|
|
private LayoutInflater mInflater;
|
|
private View.OnClickListener mOnClickListener;
|
|
private OnItemClickListener<LiveChatBean> mOnItemClickListener;
|
|
private RecyclerView mRecyclerView;
|
|
private LinearLayoutManager mLayoutManager;
|
|
|
|
public LiveChatAdapter(Context context) {
|
|
mContext = context;
|
|
mList = new ArrayList<>();
|
|
mInflater = LayoutInflater.from(context);
|
|
mOnClickListener = new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
Object tag = v.getTag();
|
|
if (tag != null) {
|
|
LiveChatBean bean = (LiveChatBean) tag;
|
|
if (mOnItemClickListener != null) {
|
|
if (bean.getType() != LiveChatBean.SYSTEM) {
|
|
mOnItemClickListener.onItemClick(bean, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
public void setOnItemClickListener(OnItemClickListener<LiveChatBean> onItemClickListener) {
|
|
mOnItemClickListener = onItemClickListener;
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
return mList.get(position).getType();
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
if (viewType == LiveChatBean.RED_PACK) {
|
|
return new RedPackVh(mInflater.inflate(R.layout.item_live_chat_red_pack, parent, false));
|
|
} else {
|
|
return new Vh(mInflater.inflate(R.layout.item_live_chat, parent, false));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder vh, int position) {
|
|
if (vh instanceof Vh) {
|
|
((Vh) vh).setData(mList.get(position), position);
|
|
} else if (vh instanceof RedPackVh) {
|
|
((RedPackVh) vh).setData(mList.get(position));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return mList.size();
|
|
}
|
|
|
|
@Override
|
|
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
|
|
mRecyclerView = recyclerView;
|
|
mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
|
|
}
|
|
|
|
class RedPackVh extends RecyclerView.ViewHolder {
|
|
|
|
LinearLayout mBg;
|
|
TextView mTextView;
|
|
|
|
public RedPackVh(View itemView) {
|
|
super(itemView);
|
|
mBg = (LinearLayout) itemView.findViewById(R.id.bg);
|
|
mTextView = (TextView) itemView.findViewById(R.id.text_txt);
|
|
}
|
|
|
|
void setData(LiveChatBean bean) {
|
|
mTextView.setText(bean.getContent());
|
|
}
|
|
}
|
|
|
|
class Vh extends RecyclerView.ViewHolder {
|
|
|
|
LinearLayout mBg, view_follow, view_action_game, view_zg;
|
|
TextView mTextView, tv_chat_active_into, tv_chat_avtive_name, tv_zg_anchorname;
|
|
RoundedImageView avatar;
|
|
View v_chat_active_close;
|
|
RecyclerView rv_chat_active;
|
|
ImageView img_zg_img;
|
|
|
|
public Vh(View itemView) {
|
|
super(itemView);
|
|
mBg = (LinearLayout) itemView.findViewById(R.id.bg);
|
|
mTextView = (TextView) itemView.findViewById(R.id.text_txt);
|
|
itemView.setOnClickListener(mOnClickListener);
|
|
|
|
view_follow = (LinearLayout) itemView.findViewById(R.id.view_follow);
|
|
avatar = (RoundedImageView) itemView.findViewById(R.id.avatar);
|
|
|
|
view_action_game = (LinearLayout) itemView.findViewById(R.id.view_action_game);
|
|
tv_chat_active_into = (TextView) itemView.findViewById(R.id.tv_chat_active_into);
|
|
tv_chat_avtive_name = (TextView) itemView.findViewById(R.id.tv_chat_avtive_name);
|
|
v_chat_active_close = (View) itemView.findViewById(R.id.v_chat_active_close);
|
|
rv_chat_active = (RecyclerView) itemView.findViewById(R.id.rv_chat_active);
|
|
|
|
view_zg = (LinearLayout) itemView.findViewById(R.id.view_zg);
|
|
tv_zg_anchorname = (TextView) itemView.findViewById(R.id.tv_zg_anchorname);
|
|
img_zg_img = (ImageView) itemView.findViewById(R.id.img_zg_img);
|
|
|
|
}
|
|
|
|
void setData(final LiveChatBean bean, int position) {
|
|
itemView.setTag(bean);
|
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
params.setMargins(0, 0, DpUtil.dp2px(80), 12);
|
|
mBg.setLayoutParams(params);
|
|
if (bean.getType() == 6) {//大作战活动
|
|
view_action_game.setVisibility(View.VISIBLE);
|
|
bean.setHeart(position);
|
|
params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
params.setMargins(0, 0, 80, 12);
|
|
mBg.setLayoutParams(params);
|
|
|
|
mTextView.setVisibility(View.GONE);
|
|
tv_chat_avtive_name.setText(bean.getUserNiceName());
|
|
|
|
String wordStore = bean.getMedalLevelImageUrl();
|
|
String[] word = wordStore.split(",");
|
|
List<String> wordsList = Arrays.asList(word);
|
|
Collections.reverse(wordsList);
|
|
|
|
ListAdapter listAdapter = new ListAdapter(mContext, wordsList);
|
|
GridLayoutManager gridLayoutManager = new GridLayoutManager(mContext, 10);
|
|
rv_chat_active.setLayoutManager(gridLayoutManager);
|
|
rv_chat_active.setAdapter(listAdapter);
|
|
|
|
tv_chat_active_into.setOnClickListener(new View.OnClickListener() {//点击打开活动
|
|
@Override
|
|
public void onClick(View v) {
|
|
String url = CommonAppConfig.HOST + "/" + bean.getContent() + "?uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken() + "&anchorUid=" + LiveRoomViewHolder.mLiveUid;
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("url", url);
|
|
LiveHDDialogFragment fragment = new LiveHDDialogFragment();
|
|
fragment.setArguments(bundle);
|
|
fragment.show(((LiveAudienceActivity) mContext).getSupportFragmentManager(), "LiveHDDialogFragment");
|
|
}
|
|
});
|
|
v_chat_active_close.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
removetItem(bean);
|
|
}
|
|
});
|
|
} else if (bean.getType() == -3 || bean.getType() == -4 || bean.getType() == -5) {//整蛊
|
|
if (bean.getBubble() != null && !bean.getBubble().equals("")) {
|
|
//加载.9图聊天气泡
|
|
LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1);
|
|
} else {
|
|
mBg.setBackgroundResource(R.drawable.bg_live_chat_item);
|
|
}
|
|
SpannableStringBuilder builder = new SpannableStringBuilder();
|
|
if (bean.getType() == -3) {
|
|
String str1 = "整蠱來了! ";
|
|
String str2 = "向 ";
|
|
builder.append(str1);
|
|
int length = builder.length();
|
|
builder.append(bean.getUserNiceName());
|
|
builder.setSpan(new ForegroundColorSpan(0xFF73FFFF), length, length + bean.getUserNiceName().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append(str2);
|
|
int length2 = builder.length();
|
|
builder.append(bean.getAnchorName());
|
|
builder.setSpan(new ForegroundColorSpan(0xFF73FFFF), length2, length2 + bean.getAnchorName().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append("發出了 " + bean.getContent());
|
|
mTextView.setText(builder);
|
|
} else if (bean.getType() == -4) {
|
|
String str1 = "成功拯救了 ";
|
|
String str2 = "免除了 ";
|
|
int length = builder.length();
|
|
builder.append(bean.getMedal());
|
|
builder.setSpan(new ForegroundColorSpan(0xFF73FFFF), length, length + bean.getMedal().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append(str1);
|
|
int length2 = builder.length();
|
|
builder.append(bean.getAnchorName());
|
|
builder.setSpan(new ForegroundColorSpan(0xFF73FFFF), length2, length2 + bean.getAnchorName().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append(str2 + bean.getUserNiceName() + "發起的" + bean.getContent());
|
|
mTextView.setText(builder);
|
|
} else if (bean.getType() == -5) {
|
|
mBg.setBackground(null);
|
|
mTextView.setVisibility(View.GONE);
|
|
view_zg.setVisibility(View.VISIBLE);
|
|
tv_zg_anchorname.setText(Constants.nowAnchorName);
|
|
ImgLoader.display(mContext, bean.getPrankIcon(), img_zg_img);
|
|
}
|
|
} else if (bean.getType() == -6) {
|
|
if (bean.getBubble() != null && !bean.getBubble().equals("")) {
|
|
//加载.9图聊天气泡
|
|
LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1);
|
|
} else {
|
|
mBg.setBackgroundResource(R.drawable.bg_live_chat_item);
|
|
}
|
|
String str1 = "火力四射,魅力無限!感謝";
|
|
String str2 = "為本直播間加成熱度";
|
|
SpannableStringBuilder builder = new SpannableStringBuilder();
|
|
builder.append(str1);
|
|
int length = builder.length();
|
|
builder.append(bean.getUserNiceName());
|
|
builder.setSpan(new ForegroundColorSpan(0xffffff00), length, length + bean.getUserNiceName().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append(str2);
|
|
int length2 = builder.length();
|
|
builder.append(bean.getHot_card());
|
|
builder.setSpan(new ForegroundColorSpan(0xffffff00), length2, length2 + bean.getHot_card().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
mTextView.setText(builder);
|
|
} else if (bean.getType() == -7) {
|
|
if (bean.getBubble() != null && !bean.getBubble().equals("")) {
|
|
//加载.9图聊天气泡
|
|
LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1);
|
|
} else {
|
|
mBg.setBackgroundResource(R.drawable.bg_live_chat_item);
|
|
}
|
|
String str1 = "甜蜜不停,愛意不斷!恭喜";
|
|
String str2 = "在甜蜜約會中搶購到了";
|
|
String str3 = "!";
|
|
SpannableStringBuilder builder = new SpannableStringBuilder();
|
|
builder.append(str1);
|
|
int length = builder.length();
|
|
builder.append(bean.getUserNiceName());
|
|
builder.setSpan(new ForegroundColorSpan(0xffffff00), length, length + bean.getUserNiceName().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
builder.append(str2);
|
|
int length2 = builder.length();
|
|
builder.append(bean.getHot_num());
|
|
builder.append(str3);
|
|
builder.setSpan(new ForegroundColorSpan(0xffffff00), length2, length2 + bean.getHot_num().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
mTextView.setText(builder);
|
|
} else if (bean.getType() == -10) {
|
|
mBg.setBackground(null);
|
|
} else if (bean.getType() == LiveChatBean.SYSTEM) {
|
|
boolean isContains = false;
|
|
for (LiveChatBean model : mList) {
|
|
if (!TextUtils.isEmpty(model.getContent()) && model.getContent().contains("堅決維護青少年群體精神文明健康")) {
|
|
isContains = true;
|
|
}
|
|
}
|
|
if (isContains) {
|
|
mTextView.setTextColor(0xffffffff);
|
|
mBg.setBackground(null);
|
|
mTextView.setText(bean.getContent());
|
|
}
|
|
} else if (bean.getType() == -1) {//自动消息,关注
|
|
boolean isContains = false;
|
|
for (LiveChatBean model : mList) {
|
|
if (bean.getType() == -1) {
|
|
isContains = true;
|
|
}
|
|
}
|
|
if (isContains) {
|
|
mBg.setBackground(null);
|
|
mTextView.setVisibility(View.GONE);
|
|
view_follow.setVisibility(View.VISIBLE);
|
|
ImgLoader.display(mContext, bean.getId(), avatar);
|
|
bean.setHeart(position);
|
|
}
|
|
|
|
} else if (bean.getType() == -2) {//自动消息,点击发言
|
|
boolean isContains = false;
|
|
for (LiveChatBean model : mList) {
|
|
if (bean.getType() == -2) {
|
|
isContains = true;
|
|
}
|
|
}
|
|
if (isContains) {
|
|
mBg.setBackgroundResource(R.drawable.bg_chat_automatic_item);
|
|
mTextView.setText(R.string.automatic_chat);
|
|
bean.setHeart(position);
|
|
}
|
|
} else if (bean.getType() == MSG_HOUR_RANK_CHANGE) {
|
|
mBg.setBackgroundResource(R.drawable.bg_chat_automatic_item);
|
|
mTextView.setText(bean.getContent());
|
|
bean.setHeart(position);
|
|
} else if (bean.getType() == RECOMMEND_CARD_NOTIFY) {
|
|
//加载.9图聊天气泡
|
|
LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1);
|
|
LiveTextRender.recommendCardNotify(mContext, mTextView, bean);
|
|
} else {
|
|
if (bean.getBubble() != null && !bean.getBubble().equals("")) {
|
|
//加载.9图聊天气泡
|
|
LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1);
|
|
} else {
|
|
mBg.setBackgroundResource(R.drawable.bg_live_chat_item);
|
|
}
|
|
if (bean.getType() == LiveChatBean.ENTER_ROOM || bean.getType() == LiveChatBean.LIGHT) {
|
|
mTextView.setTextColor(0xffc8c8c8);
|
|
} else {
|
|
mTextView.setTextColor(0xffffffff);
|
|
}
|
|
|
|
LiveTextRender.render(mContext, mTextView, bean);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void insertItem(LiveChatBean bean) {
|
|
if (bean == null) {
|
|
return;
|
|
}
|
|
int size = mList.size();
|
|
if (size > 0) {
|
|
if (mList.get(size - 1).getType() == -10) {
|
|
mList.remove(size - 1);
|
|
size = size - 1;
|
|
}
|
|
}
|
|
//设置最大展示99条消息
|
|
if (size == 100) {
|
|
mList.remove(1);
|
|
}
|
|
mList.add(bean);
|
|
notifyItemChanged(size);
|
|
|
|
LiveChatBean beanNull = new LiveChatBean();
|
|
beanNull.setType(-10);
|
|
mList.add(beanNull);
|
|
notifyItemChanged(size + 1);
|
|
|
|
if (isSlideToBottom(mRecyclerView)){
|
|
mRecyclerView.scrollToPosition(size + 1);
|
|
}else {
|
|
Bus.get().post(new LiveAudienceEvent()
|
|
.setType(LiveAudienceEvent.LiveAudienceType.NEW_MESSAGE_REMINDER));
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 判断是否滚到底部
|
|
*
|
|
* @param recyclerView
|
|
* @return
|
|
*/
|
|
public boolean isSlideToBottom(RecyclerView recyclerView) {
|
|
if (recyclerView == null) return false;
|
|
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
|
|
>= recyclerView.computeVerticalScrollRange())
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
public void removetItem(LiveChatBean bean) {
|
|
if (bean == null) {
|
|
return;
|
|
}
|
|
mList.remove(bean.getHeart());
|
|
notifyItemRemoved(bean.getHeart());
|
|
notifyItemRangeChanged(bean.getHeart(), getItemCount());
|
|
}
|
|
|
|
public void scrollToBottom() {
|
|
if (mList.size() > 0) {
|
|
mRecyclerView.smoothScrollToPosition(mList.size() - 1);
|
|
}
|
|
}
|
|
|
|
public void clear() {
|
|
if (mList != null) {
|
|
mList.clear();
|
|
}
|
|
notifyDataSetChanged();
|
|
}
|
|
|
|
public class ListAdapter extends
|
|
RecyclerView.Adapter<ListAdapter.ViewHolder> {
|
|
private LayoutInflater mInflater;
|
|
private List<String> mDatas;
|
|
|
|
/**
|
|
* 是否可选
|
|
*/
|
|
public ListAdapter(Context context, List<String> datats) {
|
|
mInflater = LayoutInflater.from(context);
|
|
mDatas = datats;
|
|
}
|
|
|
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
|
ImageView ico;
|
|
|
|
public ViewHolder(View arg0) {
|
|
super(arg0);
|
|
ico = (ImageView) arg0.findViewById(R.id.ico);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return mDatas.size();
|
|
}
|
|
|
|
/**
|
|
* 创建ViewHolder
|
|
*/
|
|
@Override
|
|
public ListAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
|
|
View view = mInflater.inflate(R.layout.item_chat_active,
|
|
viewGroup, false);
|
|
ListAdapter.ViewHolder viewHolder = new ListAdapter.ViewHolder(view);
|
|
|
|
return viewHolder;
|
|
}
|
|
|
|
/**
|
|
* 设置值
|
|
*/
|
|
@Override
|
|
public void onBindViewHolder(final ListAdapter.ViewHolder viewHolder, @SuppressLint("RecyclerView") final int position) {
|
|
int img = 0;
|
|
if ("1".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_1;
|
|
} else if ("2".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_2;
|
|
} else if ("3".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_3;
|
|
} else if ("4".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_4;
|
|
} else if ("5".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_5;
|
|
} else if ("6".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_6;
|
|
} else if ("7".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_7;
|
|
} else if ("8".equals(mDatas.get(position))) {
|
|
img = R.mipmap.monster_8;
|
|
}
|
|
if (img != 0) {
|
|
viewHolder.ico.setBackground(mContext.getResources().getDrawable(img));
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|