123 lines
4.0 KiB
Java
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;
|
|
}
|
|
|
|
}
|