You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test-music/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java

169 lines
5.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.example.musicplayer.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.andexert.library.RippleView;
import com.example.musicplayer.R;
import com.example.musicplayer.callback.OnItemClickListener;
import com.example.musicplayer.app.App;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.util.FileUtil;
import java.util.List;
/**
* AlbumSongAdapter 是一个 RecyclerView.Adapter 的扩展,用于展示专辑中的歌曲列表。
*/
public class AlbumSongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// 歌曲数据列表
private List<AlbumSong.DataBean.ListBean> mSongsBeanList;
// 上一个被点击的位置
private int mLastPosition = -1;
// 点击事件的监听器
private OnItemClickListener mSongClick;
// 歌曲项的视图类型
private final int songType = 1;
// 底部视图的类型
private final int footerType = 2;
/**
* 构造函数,初始化歌曲列表。
* @param songsBeans 歌曲数据的列表
*/
public AlbumSongAdapter(List<AlbumSong.DataBean.ListBean> songsBeans) {
mSongsBeanList = songsBeans;
}
/**
* 设置歌曲点击事件的监听器。
* @param songClick 点击事件监听器
*/
public void setSongClick(OnItemClickListener songClick) {
mSongClick = songClick;
}
/**
* 创建新的ViewHolder实例。
* @param parent 父布局
* @param viewType 视图类型
* @return 返回对应的ViewHolder
*/
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 根据视图类型创建不同的ViewHolder
if (viewType == songType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_song_search_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
} else {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.footer_view_player_height, parent, false);
FooterHolder footerHolder = new FooterHolder(view);
return footerHolder;
}
}
/**
* 将数据绑定到ViewHolder上。
* @param viewHolder 当前ViewHolder
* @param position 当前位置
*/
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int position) {
// 如果是歌曲类型的ViewHolder
if (viewHolder instanceof ViewHolder) {
ViewHolder holder = (ViewHolder) viewHolder;
AlbumSong.DataBean.ListBean songsBean = mSongsBeanList.get(position);
// 设置歌手名称,可能包含多个歌手
StringBuilder singer = new StringBuilder(songsBean.getSinger().get(0).getName());
for (int i = 1; i < songsBean.getSinger().size(); i++) {
singer.append("、").append(songsBean.getSinger().get(i).getName());
}
holder.artistTv.setText(singer.toString());
holder.titleTv.setText(songsBean.getSongname());
holder.mItemView.setBackgroundResource(R.color.translucent);
// 根据当前播放的歌曲设置不同的显示效果
if(songsBean.getSongmid().equals(FileUtil.getSong().getSongId())){
holder.playLine.setVisibility(View.VISIBLE);
holder.titleTv.setTextColor(App.getContext().getResources().getColor(R.color.yellow));
holder.artistTv.setTextColor(App.getContext().getResources().getColor(R.color.yellow));
mLastPosition = position;
}else{
holder.playLine.setVisibility(View.INVISIBLE);
holder.titleTv.setTextColor(App.getContext().getResources().getColor(R.color.white));
holder.artistTv.setTextColor(App.getContext().getResources().getColor(R.color.white_blue));
}
// 设置点击事件
holder.mItemView.setOnRippleCompleteListener(rippleView -> {
mSongClick.onClick(position);
equalPosition(position);
});
}
}
/**
* 返回总的条目数,包括底部视图。
* @return 总条目数
*/
@Override
public int getItemCount() {
return mSongsBeanList.size() + 1;
}
/**
* 根据位置返回不同的视图类型。
* @param position 位置
* @return 视图类型
*/
@Override
public int getItemViewType(int position) {
return position + 1 == getItemCount() ? footerType : songType;
}
/**
* ViewHolder类用于歌曲列表项。
*/
class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTv;
TextView artistTv;
RippleView mItemView;
View playLine;
ViewHolder(View itemView) {
super(itemView);
titleTv = itemView.findViewById(R.id.tv_title);
artistTv = itemView.findViewById(R.id.tv_artist);
playLine = itemView.findViewById(R.id.line_play);
mItemView = itemView.findViewById(R.id.ripple);
}
}
/**
* FooterHolder类用于底部视图。
*/
class FooterHolder extends RecyclerView.ViewHolder {
FooterHolder(View itemView) {
super(itemView);
}
}
/**
* 处理点击事件,更新上一次点击的位置。
* @param position 当前点击的位置
*/
private void equalPosition(int position) {
if (position != mLastPosition) {
if (mLastPosition != -1) notifyItemChanged(mLastPosition);
mLastPosition = position;
}
notifyItemChanged(position);
}
}