pdlivexp/common/src/main/java/com/yunbao/common/adapter/SudGameChatAdapter.java
2024-01-10 15:48:10 +08:00

123 lines
4.0 KiB
Java

package com.yunbao.common.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.yunbao.common.R;
import com.yunbao.common.bean.SudGameChatImModel;
import com.yunbao.common.views.SudGameChatViewHolder;
import java.util.ArrayList;
import java.util.List;
public class SudGameChatAdapter extends RecyclerView.Adapter {
private boolean isBottom = false;
List<SudGameChatImModel> sudGameChatImModels = new ArrayList<>();
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;
private int mRecyclerViewScrolledDy;
private Context mContext;
public SudGameChatAdapter(Context mContext) {
this.mContext = mContext;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View herdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_sud_game_chat_item_holder, parent, false);
return new SudGameChatViewHolder(herdView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof SudGameChatViewHolder) {
SudGameChatViewHolder itemViewHolder = (SudGameChatViewHolder) holder;
itemViewHolder.sudGameChat(sudGameChatImModels.get(position));
}
}
@Override
public int getItemCount() {
return sudGameChatImModels.size();
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (isBottom && dy >= 0) return;
mRecyclerViewScrolledDy = dy;
isBottom = false;
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == 0 && isSlideToBottom(recyclerView)) {
mRecyclerViewScrolledDy = 0;
scrollToBottom();
isBottom = true;
} else if (newState == 0) {
isBottom = false;
}
}
});
}
public synchronized void insertItem(SudGameChatImModel bean) {
if (bean == null) {
return;
}
int size = sudGameChatImModels.size();
//设置最大展示99条消息
if (size >= 100 && (isBottom || mRecyclerViewScrolledDy == 0)) {
sudGameChatImModels.subList(0, 50).clear();
notifyItemRangeRemoved(0, 50);
}
sudGameChatImModels.add(bean);
if (getItemCount() == 1) {
notifyDataSetChanged();
} else {
notifyItemInserted(getItemCount());
}
if (isBottom || mRecyclerViewScrolledDy == 0) {
scrollToBottom();
}
}
/**
* 判断是否滚到底部
*
* @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 scrollToBottom() {
if (sudGameChatImModels.size() > 0) {
mRecyclerView.smoothScrollToPosition(getItemCount());
}
mRecyclerViewScrolledDy = 0;
}
}