package com.xscm.modulemain.dialog; import android.content.Context; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.LinearLayoutManager; import android.view.Gravity; import android.view.Window; import android.view.WindowManager; import com.blankj.utilcode.util.ToastUtils; import com.xscm.modulemain.R; import com.xscm.modulemain.activity.room.activity.RoomActivity; import com.xscm.modulemain.activity.room.contacts.RoomContacts; import com.xscm.modulemain.activity.room.presenter.RoomPresenter; import com.xscm.modulemain.adapter.RoomOnlineAdapter; import com.xscm.modulemain.databinding.FragmentRoomOnlineDialogBinding; import com.xscm.moduleutil.base.BaseMvpDialogFragment; import com.xscm.moduleutil.bean.RedPacketInfo; import com.xscm.moduleutil.bean.RoomCharmRankBean; import com.xscm.moduleutil.bean.UserOnlineStatusBean; import com.xscm.moduleutil.bean.room.RoomInfoResp; import com.xscm.moduleutil.bean.room.RoomOnline; import com.xscm.moduleutil.bean.room.RoomOnlineBean; import com.xscm.moduleutil.bean.room.RoomUserBean; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; import java.util.ArrayList; import java.util.List; /** * @author qx * @data 2025/6/10 * @description: 在线列表弹框 */ public class RoomOnlineDialogFragment extends BaseMvpDialogFragment implements RoomContacts.View { private int page; private RoomOnlineAdapter roomOnlineAdapter; private RoomOnlineAdapter roomOnlineAdapter2; private String roomId; private String pit_number; private RoomUserBean hostUser; protected RoomInfoResp roomInfoResp; @Override protected RoomPresenter bindPresenter() { return new RoomPresenter(this, getActivity()); } public static RoomOnlineDialogFragment show(String id, String pit_number, RoomUserBean hostUser, RoomInfoResp roomInfoResp, FragmentManager fragmentManager) { RoomOnlineDialogFragment dialogFragment = new RoomOnlineDialogFragment(); Bundle args = new Bundle(); args.putString("roomId", id); // 可选:传递参数 args.putString("pit_number", pit_number); args.putSerializable("hostUser", hostUser); // 可选:传递参数 args.putSerializable("roomInfoResp", roomInfoResp); dialogFragment.setArguments(args); dialogFragment.show(fragmentManager, "RoomOnlineDialogFragment"); return dialogFragment; } @Override protected void initData() { MvpPre.getRoomOnline(getArguments().getString("roomId"), "1", "10"); } @Override public void onStart() { super.onStart(); Window window = getDialog().getWindow(); if (window != null) { // 设置固定高度为 500dp int screenHeight = getResources().getDisplayMetrics().heightPixels; int heightInDp = (int) (screenHeight * 0.6f); window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, heightInDp); // 可选:设置动画样式(从底部弹出) window.setWindowAnimations(com.xscm.moduleutil.R.style.CommonShowDialogBottom); } } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); roomId = getArguments().getString("roomId"); pit_number = getArguments().getString("pit_number"); hostUser = (RoomUserBean) getArguments().getSerializable("hostUser"); roomInfoResp = (RoomInfoResp) getArguments().getSerializable("roomInfoResp"); } @Override protected void initView() { mBinding.srl.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { @Override public void onLoadMore(@NonNull RefreshLayout refreshLayout) { // 添加延迟以避免过于频繁的请求 page++; if (MvpPre != null && getArguments() != null) { MvpPre.getRoomOnline(getArguments().getString("roomId"), page + "", "10"); } else { refreshLayout.finishLoadMore(false); } } @Override public void onRefresh(@NonNull RefreshLayout refreshLayout) { page = 1; if (MvpPre != null && getArguments() != null) { MvpPre.getRoomOnline(getArguments().getString("roomId"), "1", "10"); } else { refreshLayout.finishRefresh(false); } } }); mBinding.rvComment.setLayoutManager(new LinearLayoutManager(getActivity())); roomOnlineAdapter = new RoomOnlineAdapter(new ArrayList()); mBinding.rvComment.setAdapter(roomOnlineAdapter); roomOnlineAdapter.setListener(new RoomOnlineAdapter.OnJoinButtonClickListener() { @Override public void onJoinButtonClick(RoomOnlineBean item) { MvpPre.hostUserPit(roomId, pit_number, item.getUser_id() + "", "1"); } @Override public void onUserInfoClick(RoomOnlineBean item) { // 使用 post 延迟执行,确保 dismiss 完成后再显示新对话框 mBinding.getRoot().post(() -> { mBinding.getRoot().post(() -> { RoomUserInfoFragment.show(roomId, item.getUser_id() + "", pit_number, getHostUser(hostUser), false, 4, isNumberWhether(), getParentFragmentManager()); }); dismiss(); }); } }); } // 在类中添加以下方法 private void resetRefreshState() { if (mBinding != null && mBinding.srl != null) { mBinding.srl.resetNoMoreData(); } page = 1; } private int isNumberWhether() { for (int i = 0; i < roomInfoResp.getRoom_info().getPit_list().size(); i++) { if (roomInfoResp.getRoom_info().getPit_list().get(i).getPit_number().equals("9") && roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id() != null && !roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id().equals("0") && !roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id().isEmpty()) return 1; } return 0; } private int getHostUser(RoomUserBean item) { if (item.getPit_number() == 9) { if (item.getIs_room_owner() == 1) { return 1; } else if (item.getIs_management() == 1) { return 2; } else if (item.getIs_host() == 1) { return 3; } else { return 4; } } else { if (item.getIs_room_owner() == 1) { return 1; } else if (item.getIs_management() == 1) { return 2; } else if (item.getIs_host() == 1) { return 3; } return 4; } } @Override protected void initDialogStyle(Window window) { super.initDialogStyle(window); window.setGravity(Gravity.BOTTOM); } @Override protected int getLayoutId() { return R.layout.fragment_room_online_dialog; } @Override public void roomInfo(RoomInfoResp resp) { } @Override public void showPasswordDialog() { } @Override public void enterFail() { } @Override public void getRoomOnline(RoomOnline onlineBean) { try { // 确保在主线程中执行UI操作 if (getActivity() == null || mBinding == null) { return; } getActivity().runOnUiThread(() -> { // 完成刷新或加载更多操作 if (mBinding.srl != null) { if (page <= 1) { mBinding.srl.finishRefresh(); } else { mBinding.srl.finishLoadMore(); } } List roomOnlineBeanList = new ArrayList<>(); // 处理第一页数据(刷新操作) if (page <= 1) { // 清空之前的数据 roomOnlineAdapter.setNewData(new ArrayList<>()); } int type_pit; if (pit_number.isEmpty()) { type_pit = 1; } else { type_pit = 2; } if (onlineBean.getOn_pit() != null && onlineBean.getOn_pit().size() > 0) { RoomOnlineBean roomOnlineBean = new RoomOnlineBean(); roomOnlineBean.setItemViewType(1); roomOnlineBean.setTypeNames("麦上用户"); roomOnlineBeanList.add(roomOnlineBean); for (RoomOnlineBean roomOnlineBean1 : onlineBean.getOn_pit()) { roomOnlineBean1.setType(1); roomOnlineBean1.setType_pit(0); roomOnlineBean1.setItemViewType(2); roomOnlineBeanList.add(roomOnlineBean1); } } if (onlineBean.getOff_pit() != null && onlineBean.getOff_pit().size() > 0) { RoomOnlineBean roomOnlineBean = new RoomOnlineBean(); roomOnlineBean.setItemViewType(1); roomOnlineBean.setTypeNames("麦下用户"); roomOnlineBeanList.add(roomOnlineBean); for (RoomOnlineBean roomOnlineBean2 : onlineBean.getOff_pit()) { roomOnlineBean2.setType(2); roomOnlineBean2.setType_pit(type_pit); roomOnlineBean2.setItemViewType(2); roomOnlineBeanList.add(roomOnlineBean2); } } // 根据是刷新还是加载更多来处理数据 if (page <= 1) { // 刷新操作,设置新数据 roomOnlineAdapter.setNewData(roomOnlineBeanList); } else { // 加载更多操作,添加数据 if (roomOnlineBeanList.size() > 0) { roomOnlineAdapter.addData(roomOnlineBeanList); } else { // 没有更多数据了 if (mBinding.srl != null) { mBinding.srl.finishLoadMoreWithNoMoreData(); } } } // 更新用户总数 // 更新用户总数 - 仅在第一页刷新时更新总数 if (page <= 1) { int total = 0; if (onlineBean.getOn_pit() != null) { total += onlineBean.getOn_pit().size(); } if (onlineBean.getOff_pit() != null) { total += onlineBean.getOff_pit().size(); } // 只有当获取到有效数据时才更新总数显示 if (onlineBean.getOn_pit() != null || onlineBean.getOff_pit() != null) { mBinding.tvNum.setText("用户列表(" + total + ")人"); if (getActivity() instanceof RoomActivity) { ((RoomActivity) getActivity()).setOnlineNumber(total); } } // 如果两个列表都为null,保持之前的总数显示不变 } else { // 加载更多时,更新总数显示 int currentTotal = 0; List currentData = roomOnlineAdapter.getData(); for (RoomOnlineBean bean : currentData) { if (bean.getItemViewType() == 2) { // 只统计用户项,不统计标题项 currentTotal++; } } mBinding.tvNum.setText("用户列表(" + currentTotal + ")人"); if (getActivity() instanceof RoomActivity) { ((RoomActivity) getActivity()).setOnlineNumber(currentTotal); } } // 检查是否需要禁用加载更多(如果当前页数据少于预期) if (onlineBean.getOn_pit() != null && onlineBean.getOff_pit() != null) { int currentCount = onlineBean.getOn_pit().size() + onlineBean.getOff_pit().size(); if (currentCount < 10 && page > 1) { // 每页预期10条数据 if (mBinding.srl != null) { mBinding.srl.finishLoadMoreWithNoMoreData(); } } } }); } catch (Exception e) { // 确保在异常情况下也能完成刷新操作 if (getActivity() != null && mBinding != null && mBinding.srl != null) { getActivity().runOnUiThread(() -> { if (page <= 1) { mBinding.srl.finishRefresh(false); } else { mBinding.srl.finishLoadMore(false); } }); } e.printStackTrace(); } } // @Override // public void getRoomOnline(List onlineBean) { // roomOnlineAdapter.setNewData(onlineBean); // mBinding.tvNum.setText("在线用户("+onlineBean.size()+")人"); // } @Override public void onResume() { super.onResume(); // 每次恢复时重置刷新状态 resetRefreshState(); } @Override public void applyPit() { } @Override public void downPit() { } @Override public void applySong() { } @Override public void agreeSong() { } @Override public void postRoomInfo(RoomInfoResp resp) { } @Override public void getCharmRank(List list) { } @Override public void changeSong() { } @Override public void hostUserPit() { ToastUtils.showShort("抱麦成功"); dismiss(); } @Override public void quitRoom() { } @Override public void quitRoom2(String roomId) { } @Override public void userGuanzSuccess(String s) { } @Override public void acceptPk() { } @Override public void clearUserCharm() { } @Override public void userOnlineStatus(List list) { } @Override public void findRoom() { mBinding.srl.finishRefresh(); mBinding.srl.finishLoadMore(); } @Override public void roomRedPackets(List list) { } }