1:完成挚友功能

2:添加在送特定礼物展示弹框功能
3:修改部分图片格式变成wedp
4:用户主页添加礼物墙和挚友
This commit is contained in:
2025-11-21 18:54:40 +08:00
parent 3c83906870
commit 1dfcf4e98c
249 changed files with 3367 additions and 396 deletions

View File

@@ -8,6 +8,9 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.xscm.modulemain.R;
import com.xscm.modulemain.databinding.ItemRequestedSongBinding;
import com.xscm.moduleutil.bean.SongPlaylist;
import com.xscm.moduleutil.utils.ImageUtils;
@@ -18,22 +21,15 @@ import java.util.List;
/**
* 已点歌曲列表适配器
*/
public class RequestedSongsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public class RequestedSongsAdapter extends BaseQuickAdapter<SongPlaylist.SongPlaylistBean, BaseViewHolder> {
// 歌曲状态常量
public static final int STATUS_PLAYING = 1; // 正在播放
public static final int STATUS_PENDING = 2; // 等待播放
public static final int STATUS_TOP = 3; // 置顶
// 列表项类型
private static final int TYPE_NORMAL = 0; // 普通列表项
private static final int TYPE_FOOTER = 1; // 底部加载更多项
private List<SongPlaylist.SongPlaylistBean> songList = new ArrayList<>();
private boolean isShowFooter = false; // 是否显示底部加载更多
private OnItemClickListener onItemClickListener;
public RequestedSongsAdapter() {
super(R.layout.item_requested_song);
}
public interface OnItemClickListener {
void onPlayClick(SongPlaylist.SongPlaylistBean song, int position);
@@ -44,166 +40,32 @@ public class RequestedSongsAdapter extends RecyclerView.Adapter<RecyclerView.Vie
this.onItemClickListener = listener;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 创建普通列表项视图
ItemRequestedSongBinding binding = ItemRequestedSongBinding.inflate(
LayoutInflater.from(parent.getContext()), parent, false);
return new SongViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof FooterViewHolder) {
// 底部加载更多项,不需要处理
return;
}
if (holder instanceof SongViewHolder) {
// 普通列表项
SongViewHolder songHolder = (SongViewHolder) holder;
// 检查位置是否有效,防止索引越界
if (position >= songList.size()) {
return;
}
SongPlaylist.SongPlaylistBean song = songList.get(position);
// 设置歌曲信息
songHolder.binding.tvSongName.setText(song.getSong_name());
ImageUtils.loadHead(song.getBase_image(), songHolder.binding.ivSongCover);
songHolder.binding.tvSinger.setText("演唱者:" + song.getSinger_nickname());
songHolder.binding.tvRequestBos.setText("老板:" + song.getBoss_nickname());
// 根据位置显示不同的UI
if (position == 0) {
// 第一个是正在播放
songHolder.binding.tvRequestStatus.setText("正在播放");
songHolder.binding.tvRequestStatus.setTextColor(0xFF3ABC6D);
songHolder.binding.tvRequestStatus.setBackgroundColor(android.graphics.Color.TRANSPARENT);
} else {
// 第三个以后都是置顶,文字是白色的
songHolder.binding.tvRequestStatus.setText("置顶");
songHolder.binding.tvRequestStatus.setTextColor(0xFFFFFFFF);
songHolder.binding.tvRequestStatus.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r34_3abc6d);
}
// 设置tvRequestStatus的点击事件只有置顶状态才能点击
songHolder.binding.tvRequestStatus.setOnClickListener(v -> {
// 只有第三个及以后的项目position > 1才能点击tvRequestStatus
if (position > 1 && onItemClickListener != null) {
onItemClickListener.onTopClick(song, position);
}
});
}
}
@Override
public int getItemViewType(int position) {
// 如果是最后一项且需要显示底部加载更多,则返回底部类型
if (position == songList.size() && isShowFooter) {
return TYPE_FOOTER;
}
return TYPE_NORMAL;
}
@Override
public int getItemCount() {
// 如果需要显示底部加载更多则数量加1
return songList.size() + (isShowFooter ? 1 : 0);
}
/**
* 根据歌曲对象获取状态
*/
private int getStatusFromSong(SongPlaylist.SongPlaylistBean song) {
// 根据业务逻辑判断状态,这里仅作为示例
if ("1".equals(song.getStatus())) {
return STATUS_PLAYING;
} else if ("0".equals(song.getStatus())) {
return STATUS_TOP;
protected void convert(@NonNull BaseViewHolder helper, SongPlaylist.SongPlaylistBean item) {
helper.setText(R.id.tv_song_name, item.getSong_name());
helper.setText(R.id.tv_singer, "演唱者:" + item.getSinger_nickname());
helper.setText(R.id.tv_request_bos, "老板:" + item.getBoss_nickname());
ImageUtils.loadHead(item.getBase_image(), helper.getView(R.id.iv_song_cover));
// 根据位置显示不同的UI
if (helper.getLayoutPosition() == 0) {
// 第一个是正在播放
helper.setText(R.id.tv_request_status, "正在播放");
helper.setTextColor(R.id.tv_request_status, 0xFF3ABC6D);
helper.setBackgroundRes(R.id.tv_request_status, android.graphics.Color.TRANSPARENT);
} else {
return STATUS_PENDING;
// 第三个以后都是置顶,文字是白色的
helper.setText(R.id.tv_request_status, "置顶");
helper.setTextColor(R.id.tv_request_status, 0xFFFFFFFF);
helper.setBackgroundRes(R.id.tv_request_status, com.xscm.moduleutil.R.drawable.bg_r34_3abc6d);
}
}
/**
* 设置歌曲列表
*/
public void setSongList(List<SongPlaylist.SongPlaylistBean> list) {
if (list != null) {
this.songList.clear();
this.songList.addAll(list);
notifyDataSetChanged();
}
}
/**
* 添加歌曲列表(用于加载更多)
*/
public void addSongList(List<SongPlaylist.SongPlaylistBean> list) {
if (list != null) {
int startPos = this.songList.size();
this.songList.addAll(list);
notifyItemRangeInserted(startPos, list.size());
}
}
/**
* 显示或隐藏底部加载更多
*/
public void setShowFooter(boolean showFooter) {
boolean wasShowing = this.isShowFooter;
this.isShowFooter = showFooter;
if (wasShowing != showFooter) {
if (showFooter) {
notifyItemInserted(songList.size());
} else {
notifyItemRemoved(songList.size());
// 设置tvRequestStatus的点击事件只有置顶状态才能点击
helper.getView(R.id.tv_request_status).setOnClickListener(v -> {
// 只有第三个及以后的项目position > 1才能点击tvRequestStatus
if (helper.getLayoutPosition() > 1 && onItemClickListener != null) {
onItemClickListener.onTopClick(item, helper.getLayoutPosition());
}
}
}
/**
* 清空列表
*/
public void clear() {
this.songList.clear();
notifyDataSetChanged();
}
/**
* 获取指定位置的歌曲
*/
public SongPlaylist.SongPlaylistBean getItem(int position) {
if (position >= 0 && position < songList.size()) {
return songList.get(position);
}
return null;
}
/**
* 普通列表项ViewHolder
*/
static class SongViewHolder extends RecyclerView.ViewHolder {
ItemRequestedSongBinding binding;
public SongViewHolder(@NonNull ItemRequestedSongBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
/**
* 底部加载更多ViewHolder
*/
static class FooterViewHolder extends RecyclerView.ViewHolder {
public FooterViewHolder(@NonNull View itemView) {
super(itemView);
}
});
}
}

View File

@@ -72,9 +72,9 @@ public class RelationshipFragment extends BaseMvpDialogFragment<RoomUserPresente
adapter = new RelationshipAdapter();
mBinding.rvHostList.setAdapter(adapter);
adapter.setOnItemClickListener((RelationshipAdapter.OnItemClickListener) (view, data, position) -> {
if (view.getId() == R.id.im_zhid) {
if (view.getId() == R.id.icon_cp_zd) {
queren(1, data.getId(), "");
} else if (view.getId() == R.id.im_shanchu) {
} else if (view.getId() == R.id.icon_cp_dele) {
queren(2, data.getId(), data.getDelete_me_coin());
}
});

View File

@@ -24,7 +24,9 @@ import com.xscm.moduleutil.bean.SingerSongCount;
import com.xscm.moduleutil.bean.SongPlaylist;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 已点歌曲页面Fragment
@@ -130,34 +132,57 @@ public class RequestedSongsFragment extends BaseMvpFragment<RequestSongPresenter
@Override
public void singerSongList(SongPlaylist s) {
// 这个方法似乎是处理单个歌曲的,我们可能需要另一个方法处理列表
// 这个方法处理歌曲列表数据,并过滤重复数据
if (s != null &&s.getLists()!=null && s.getLists().size() > 0 ) {
if (s != null && s.getLists() != null && s.getLists().size() > 0) {
// 判断当前是刷新还是加载更多
RefreshState state = mBinding.smartRefreshLayout.getState();
if (state == RefreshState.Refreshing) {
// 刷新,清空列表并添加新数据
songList.clear();
songList.addAll(s.getLists());
adapter.setSongList(songList);
adapter.setNewData(songList);
mBinding.smartRefreshLayout.finishRefresh(true);
} else if (state == RefreshState.Loading) {
// 加载更多,添加数据到列表
// 加载更多,过滤重复数据后添加到列表
if (s.getLists().size() > 0) {
songList.addAll(s.getLists());
adapter.addSongList(songList);
adapter.setShowFooter(true);
mBinding.smartRefreshLayout.finishLoadMore(true);
// 创建一个集合存储现有歌曲的ID用于快速查找
Set<Integer> existingSongIds = new HashSet<>();
for (SongPlaylist.SongPlaylistBean song : songList) {
if (song.getId() != 0) {
existingSongIds.add(song.getId());
}
}
// 过滤掉已存在的歌曲
List<SongPlaylist.SongPlaylistBean> newSongs = new ArrayList<>();
for (SongPlaylist.SongPlaylistBean song : s.getLists()) {
if (song.getId() != 0 && !existingSongIds.contains(song.getId())) {
newSongs.add(song);
existingSongIds.add(song.getId()); // 添加到已存在集合中,防止本次加载的数据内部重复
}
}
// 只有当有新数据时才更新
if (!newSongs.isEmpty()) {
songList.addAll(newSongs);
adapter.addData(songList);
mBinding.smartRefreshLayout.finishLoadMore(true);
} else {
// 没有新数据,但不算加载失败
mBinding.smartRefreshLayout.finishLoadMore(true);
}
} else {
// 没有更多数据
adapter.setShowFooter(false);
// adapter.setShowFooter(false);
mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData();
}
} else {
// 首次加载
songList.clear();
songList.addAll(s.getLists());
adapter.setSongList(songList);
adapter.setNewData(songList);
mBinding.smartRefreshLayout.finishRefresh();
}

View File

@@ -39,7 +39,7 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
private String currentTimeFilter = "today"; // 默认为今日
private int page = 1;
private String roomId;
private String type="1";
private String type="2";
private SongHistoryAdapter adapter;
@@ -82,7 +82,7 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
resetFilterStyles();
mBinding.tvFilterToday.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r16_3abc6d);
currentTimeFilter = "today";
type="1";
type="2";
updateHistoryList();
}
});
@@ -93,7 +93,7 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
resetFilterStyles();
mBinding.tvFilterYesterday.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r16_3abc6d);
currentTimeFilter = "yesterday";
type="2";
type="3";
updateHistoryList();
}
});
@@ -104,7 +104,7 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
resetFilterStyles();
mBinding.tvFilterThisWeek.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r16_3abc6d);
currentTimeFilter = "this_week";
type="3";
type="4";
updateHistoryList();
}
});
@@ -115,7 +115,7 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
resetFilterStyles();
mBinding.tvFilterLastWeek.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r16_3abc6d);
currentTimeFilter = "last_week";
type="4";
type="5";
updateHistoryList();
}
});
@@ -193,8 +193,9 @@ public class SongHistoryFragment extends BaseMvpFragment<RequestSongPresenter,Fr
} else if (state == RefreshState.Loading) {
// 加载更多,添加数据到列表
if (s.getLists().size() > 0) {
// 只添加新加载的数据,而不是整个列表
songList.addAll(s.getLists());
adapter.addData(songList);
adapter.addData(s.getLists());
mBinding.smartRefreshLayout.finishLoadMore(true);
} else {
// 没有更多数据